Python3 爬虫学习笔记第十五章 —— 【代理的基本使用】


文章目录

  • 【15.1】代理初识
  • 【15.2】urllib 库使用代理
  • 【15.3】requests 库使用代理
  • 【15.4】Selenium 使用代理
    • 【15.4.1】Chrome
    • 【15.4.1】PhantomJS

【15.1】代理初识

大多数网站都有反爬虫机制,如果一段时间内同一个 IP 发送的请求过多,服务器就会拒绝访问,直接禁封该 IP,此时,设置代理即可解决这个问题,网络上有许多免费代理和付费代理,比如西刺代理,全网代理 IP,快代理等,设置代理需要用到的就是代理 IP 地址和端口号,如果电脑上装有代理软件(例如:酸酸乳SSR),软件一般会在本机创建 HTTP 或 SOCKS 代理服务,直接使用此代理也可以

【15.2】urllib 库使用代理

from urllib.error import URLError
from urllib.request import ProxyHandler, build_openerproxy = '127.0.0.1:1080'
proxy_handler = ProxyHandler({'http': 'http://' + proxy,'https': 'https://' + proxy
})
opener = build_opener(proxy_handler)
try:response = opener.open('http://httpbin.org/get')print(response.read().decode('utf8'))
except URLError as e:print(e.reason)

http://httpbin.org/get 是一个请求测试站点,借助 ProxyHandler 设置代理,参数为字典类型,键名为协议类型,键值为代理,代理的写法:proxy = '127.0.0.1:1080',其中 127.0.0.1 为 IP 地址,1080 为端口号,这里表示本机的代理软件已经在本地 1080 端口创建了代理服务,代理前面需要加上 http 或者 https 协议,当请求的链接为 http 协议时,ProxyHandler 会自动调用 http 代理,同理,当请求的链接为 https 协议时,ProxyHandler 会自动调用 https 代理,build_opener() 方法传入 ProxyHandler 对象来创建一个 opener,调用 open() 方法传入一个 url 即可通过代理访问该链接,运行结果为一个 JSON,origin 字段为此时客户端的 IP

{"args": {}, "headers": {"Accept-Encoding": "identity", "Host": "httpbin.org", "User-Agent": "Python-urllib/3.6"}, "origin": "168.70.60.141, 168.70.60.141", "url": "https://httpbin.org/get"
}

如果是需要认证的代理,只需要在代理前面加入代理认证的用户名密码即可:

from urllib.error import URLError
from urllib.request import ProxyHandler, build_openerproxy = 'username:password@127.0.0.1:1080'
proxy_handler = ProxyHandler({'http': 'http://' + proxy,'https': 'https://' + proxy
})
opener = build_opener(proxy_handler)
try:response = opener.open('http://httpbin.org/get')print(response.read().decode('utf8'))
except URLError as e:print(e.reason)

如果代理是 SOCKS5 类型,需要用到 socks 模块,设置代理方法如下:

扩展:SOCKS5 是一个代理协议,它在使用TCP/IP协议通讯的前端机器和服务器机器之间扮演一个中介角色,使得内部网中的前端机器变得能够访问 Internet 网中的服务器,或者使通讯更加安全

import socks
import socket
from urllib import request
from urllib.error import URLErrorsocks.set_default_proxy(socks.SOCKS5, '127.0.0.1', 1080)
socket.socket = socks.socksocket
try:response = request.urlopen('http://httpbin.org/get')print(response.read().decode('utf-8'))
except URLError as e:print(e.reason)

【15.3】requests 库使用代理

requests 库使用代理只需要传入 proxies 参数即可:

import requestsproxy = '127.0.0.1:1080'
proxies = ({'http': 'http://' + proxy,'https': 'https://' + proxy
})
try:response = requests.get('http://httpbin.org/get', proxies=proxies)print(response.text)
except requests.exceptions.ChunkedEncodingError as e:print('Error', e.args)

输出结果:

{"args": {}, "headers": {"Accept": "*/*", "Accept-Encoding": "gzip, deflate", "Host": "httpbin.org", "User-Agent": "python-requests/2.22.0"}, "origin": "168.70.60.141, 168.70.60.141", "url": "https://httpbin.org/get"
}

同样的,如果是需要认证的代理,也只需要在代理前面加入代理认证的用户名密码即可:

import requestsproxy = 'username:password@127.0.0.1:1080'
proxies = ({'http': 'http://' + proxy,'https': 'https://' + proxy
})
try:response = requests.get('http://httpbin.org/get', proxies=proxies)print(response.text)
except requests.exceptions.ChunkedEncodingError as e:print('Error', e.args)

如果代理是 SOCKS5 类型,需要用到 requests[socks] 模块或者 socks 模块,使用 requests[socks] 模块时设置代理方法如下:

import requestsproxy = '127.0.0.1:1080'
proxies = {'http': 'socks5://' + proxy,'https': 'socks5://' + proxy
}
try:response = requests.get('http://httpbin.org/get', proxies=proxies)print(response.text)
except requests.exceptions.ConnectionError as e:print('Error', e.args)

使用 socks 模块时设置代理方法如下(此类方法为全局设置):

import requests
import socks
import socketsocks.set_default_proxy(socks.SOCKS5, '127.0.0.1', 1080)
socket.socket = socks.socksocket
try:response = requests.get('http://httpbin.org/get')print(response.text)
except requests.exceptions.ConnectionError as e:print('Error', e.args)

【15.4】Selenium 使用代理

【15.4.1】Chrome

from selenium import webdriverproxy = '127.0.0.1:1080'
chrome_options = webdriver.ChromeOptions()
chrome_options.add_argument('--proxy-server=http://' + proxy)
path = r'F:\PycharmProjects\Python3爬虫\chromedriver.exe'
browser = webdriver.Chrome(executable_path=path, chrome_options=chrome_options)
browser.get('http://httpbin.org/get')

通过 ChromeOptions 来设置代理,在创建 Chrome 对象的时候用 chrome_options 参数传递即可,访问目标链接后显示如下信息:

{"args": {}, "headers": {"Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3", "Accept-Encoding": "gzip, deflate", "Accept-Language": "zh-CN,zh;q=0.9", "Host": "httpbin.org", "Upgrade-Insecure-Requests": "1", "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3770.142 Safari/537.36"}, "origin": "168.70.60.141, 168.70.60.141", "url": "https://httpbin.org/get"
}

如果是认证代理,则设置方法如下:

from selenium import webdriver
from selenium.webdriver.chrome.options import Options
import zipfileip = '127.0.0.1'
port = 1080
username = 'username'
password = 'password'manifest_json = """{"version":"1.0.0","manifest_version": 2,"name":"Chrome Proxy","permissions": ["proxy","tabs","unlimitedStorage","storage","<all_urls>","webRequest","webRequestBlocking"],"background": {"scripts": ["background.js"]}
}
"""background_js ="""
var config = {mode: "fixed_servers",rules: {singleProxy: {scheme: "http",host: "%(ip) s",port: %(port) s}}}chrome.proxy.settings.set({value: config, scope: "regular"}, function() {});function callbackFn(details) {return {authCredentials: {username: "%(username) s",password: "%(password) s"}}
}chrome.webRequest.onAuthRequired.addListener(callbackFn,{urls: ["<all_urls>"]},['blocking']
)
""" % {'ip': ip, 'port': port, 'username': username, 'password': password}plugin_file = 'proxy_auth_plugin.zip'
with zipfile.ZipFile(plugin_file, 'w') as zp:zp.writestr("manifest.json", manifest_json)zp.writestr("background.js", background_js)
chrome_options = Options()
chrome_options.add_argument("--start-maximized")
path = r'F:\PycharmProjects\Python3爬虫\chromedriver.exe'
chrome_options.add_extension(plugin_file)
browser = webdriver.Chrome(executable_path=path, chrome_options=chrome_options)
browser.get('http://httpbin.org/get')

需要在本地创建一个 manifest.json 配置文件和 background.js 脚本来设置认证代理。运行代码之后本地会生成一个 proxy_auth_plugin.zip 文件来保存当前配置

【15.4.1】PhantomJS

借助 service_args 参数,也就是命令行参数即可设置代理:

from selenium import webdriverservice_args = ['--proxy=127.0.0.1:1080','--proxy-type=http'
]
path = r'F:\PycharmProjects\Python3爬虫\phantomjs-2.1.1\bin\phantomjs.exe'
browser = webdriver.PhantomJS(executable_path=path, service_args=service_args)
browser.get('http://httpbin.org/get')
print(browser.page_source)

运行结果:

<html><head></head><body><pre style="word-wrap: break-word; white-space: pre-wrap;">{"args": {}, "headers": {"Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8", "Accept-Encoding": "gzip, deflate", "Accept-Language": "zh-CN,en,*", "Host": "httpbin.org", "User-Agent": "Mozilla/5.0 (Windows NT 6.2; WOW64) AppleWebKit/538.1 (KHTML, like Gecko) PhantomJS/2.1.1 Safari/538.1"}, "origin": "168.70.60.141, 168.70.60.141", "url": "https://httpbin.org/get"
}
</pre></body></html>

如果是需要认证的代理,只需要在 service_args 参数加入 --proxy-auth 选项即可:

from selenium import webdriverservice_args = ['--proxy=127.0.0.1:1080','--proxy-type=http','--proxy-auth=username:password'
]
path = r'F:\PycharmProjects\Python3爬虫\phantomjs-2.1.1\bin\phantomjs.exe'
browser = webdriver.PhantomJS(executable_path=path, service_args=service_args)
browser.get('http://httpbin.org/get')
print(browser.page_source)

Python3 爬虫学习笔记 C15【代理的基本使用】相关推荐

  1. Python3 爬虫学习笔记 C18【爬虫框架 pyspider — 深入理解】

    Python3 爬虫学习笔记第十八章 -- [爬虫框架 pyspider - 深入理解] 文章目录 [18.1]启动参数 [18.2]运行单个组件 [18.2.1]运行 Scheduler [18.2 ...

  2. Python3 爬虫学习笔记 C17【爬虫框架 pyspider — 基本使用】

    Python3 爬虫学习笔记第十七章 -- [爬虫框架 pyspider - 基本使用] 文章目录 [17.1]初识 pyspider [17.2]使用 pyspider [17.2.1]主界面 [1 ...

  3. Python3 爬虫学习笔记 C16【数据储存系列 — Redis】

    Python3 爬虫学习笔记第十六章 -- [数据储存系列 - Redis] 文章目录 [16.1]关于 Redis [16.2]使用 Redis [16.3]Key(键)操作 [16.4]Strin ...

  4. Python3 爬虫学习笔记 C14【验证码对抗系列 — 点触验证码】

    Python3 爬虫学习笔记第十四章 -- [验证码对抗系列 - 点触验证码] 文章目录 [14.1]关于点触验证码 [14.2]点触验证码攻克思路 [14.3]模拟登录 12306 - 总体思路 [ ...

  5. Python3 爬虫学习笔记 C13【验证码对抗系列 — 滑动验证码】

    Python3 爬虫学习笔记第十三章 -- [验证码对抗系列 - 滑动验证码] 文章目录 [13.1]关于滑动验证码 [13.2]滑动验证码攻克思路 [13.3]模拟登录 bilibili - 总体思 ...

  6. Python3 爬虫学习笔记 C12【验证码对抗系列 — 图形验证码】

    Python3 爬虫学习笔记第十二章 -- [验证码对抗系列 - 图形验证码] 文章目录 [12.1]关于普通图形验证码 [12.2]tesserocr 库识别验证码 [12.3]pytesserac ...

  7. Python3 爬虫学习笔记 C11【数据储存系列 — MongoDB】

    Python3 爬虫学习笔记第十一章 -- [数据储存系列 - MongoDB] 文章目录 [11.1]关于 MongoDB [11.2]MongoDB 基本操作语句 [11.3]连接 MongoDB ...

  8. Python3 爬虫学习笔记 C10【数据储存系列 — MySQL】

    Python3 爬虫学习笔记第十章 -- [数据储存系列 - MySQL] 文章目录 [10.1]MySQL 基本操作语句 数据库操作 表操作 表的结构 表的数据 [10.2]Python 连接 My ...

  9. Python3 爬虫学习笔记 C09【数据储存系列 — 文件储存】

    Python3 爬虫学习笔记第九章 -- [数据储存系列 - 文件储存] 文章目录 [9.1]TXT 文本存储 [9.1.1]基本示例 [9.1.2]打开方式 [9.2]JSON 文件存储 [9.2. ...

最新文章

  1. 徒手撸一个简单的IOC
  2. 程序编译是出现field has incomplete type问题的解决
  3. Verilog初级教程(20)Verilog中的`ifdef 条件编译语句
  4. 数据结构实验之链表六:有序链表的建立
  5. Synchronize读脏解决
  6. libjingle源码解析(4)-【PseudoTcp】建立UDP之上的TCP(2):对交互数据流的处理
  7. 几种常见光端机的作用介绍
  8. gravity与Layout_gravity的区别
  9. sfidsk创建可启动分区问题
  10. 微信小程序生成分享海报
  11. ScreenFlow 录制Mac电脑声音
  12. 一个老程序员的阶段性总结
  13. git rebase
  14. 好好说话之Large Bin Attack
  15. java中特殊符号怎么校验_校验中文、空格和特殊符号的方法
  16. 小米开源框架MACE 源码阅读笔记 1
  17. Foxmail:完美配置QQ邮箱、163邮箱、Google邮箱
  18. 查看aix服务器序列号,CentOS和AIX查看系统序列号
  19. python爬上市公司信息_实战项目 1:5 行代码爬取国内所有上市公司信息
  20. matlab--cvx

热门文章

  1. 细学PHP 14 mysql-4
  2. greensock包使用
  3. [转载]Visual Studio 2010敏捷利剑:详解Scrum
  4. 【转】在C#中使用SQLite
  5. 987C. Three displays
  6. netlify支持php吗,hexo netlify 搭建简易博客
  7. python全套学习方法_python学习方法总结(内附python全套学习资料)
  8. stm32 isp下载官方软件android_OpenCanvas免费版下载_OpenCanvas绘图软件官方版下载7.0.25...
  9. 智能客户端ios_为什么现在的客户端开发越来越不吃香了
  10. Wince6.0编译错误经验总结