代理的使用场景
需要爬虫高频率地访问某一站点,同时站点又存在着反爬虫措施,会封掉高频率爬取的IP:例如访问得到403 Forbidden之后提示“您的 IP 访问频率太高”或者跳出一个验证码让我们输入,输入之后才可能解封。
需要访问境外的网站
代理的设置
爬虫中可以使用多种请求库,如 Requests、Urllib、Selenium 等,下面先梳理一下这些库的代理设置方法。

获取代理
设置代理,首先需要设置一个可用的代理,搜索引擎搜索“代理”关键字,就可以看到有许多代理服务网站,在网站上会有很多免费代理。免费代理大多数情况下都是不好用的,所以比较靠谱的方法是购买付费代理,很多网站都有售卖。或者如果我们本机有相关代理软件的话,软件一般会在本机创建 HTTP 或 SOCKS 代理服务,直接使用此代理也可以。

总结一下,代理的获取方法有两种:

在网上获取或购买代理来获取的代理IP(如220.187.210.64:8118),在下一部分各个请求库的代理设置中使用该IP即可,而爬虫所带的伪装IP即为代理IP(220.187.210.64:8118);
在本机安装并运行相关代理软件,这种方式获取的代理IP与启动代理软件时的配置有关——例如,使用V2ray代理软件时它会在本地 10809端口上创建 HTTP 代理服务,也就是说代理IP为 127.0.0.1:10809,另外还会在 10808 端口创建 SOCKS 5代理服务,也就是代理IP为 127.0.0.1:10808。同样,在下一部分各个请求库的代理设置中使用这些代理IP(127.0.0.1:10808,127.0.0.1:10809)即可,而爬虫所带的伪装IP则是代理软件V2ray所连接的服务器 IP.
设置代理后测试的网址是:http://httpbin.org/get,访问该站点可以得到请求的一些相关信息,其中 origin 字段就是客户端的 IP,我们可以根据它来判断代理是否设置成功,也就是是否成功伪装了IP。

Requests

对于 Requests 来说,代理设置比较简单,我们只需要传入 proxies 参数即可。在这里,我们使用本机代理软件创建的HTTP 代理服务,进行Requests 的代理的设置,如下:

import requests

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

如果代理需要认证,同样在代理的前面加上用户名密码即可,代理的写法就变成:

proxy = 'username:password@127.0.0.1:10809'

如果需要使用 SOCKS5 代理,则首先需要安装一个 Socks 模块:

pip3 install "requests[socks]"

同样使用本机运行代理软件的方式,则爬虫设置代理的代码如下:

import requests

proxy = '127.0.0.1:10808'
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 socket

socks.set_default_proxy(socks.SOCKS5, '127.0.0.1', 10808)
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)

Selenium

Selenium 也可以设置代理,在设置方法上分有无界面的浏览器两种方法,因此对于有界面浏览器,将以 Chrome 为例介绍;而对于无界面浏览器,以 PhantomJS 为例介绍。

1.Chrome

对于 Chrome 来说,用 Selenium 设置代理的方法也非常简单,设置方法如下:

from selenium import webdriver

proxy = '127.0.0.1:10809'
chrome_options = webdriver.ChromeOptions()
chrome_options.add_argument('--proxy-server=http://' + proxy)
browser = webdriver.Chrome(chrome_options=chrome_options)
browser.get('http://httpbin.org/get')

2.PhantomJS

对于 PhantomJS,代理设置方法可以借助于 service_args 参数,也就是命令行参数;在这里我们只需要使用 service_args 参数,将命令行的一些参数定义为列表,在初始化的时候传递即可。

因此,代理设置方法如下:

from selenium import webdriver

service_args = [
'--proxy=127.0.0.1:10809',
'--proxy-type=http'
]
browser = webdriver.PhantomJS(service_args=service_args)
browser.get('http://httpbin.org/get')
print(browser.page_source)

如果需要认证,那么只需要再加入 –proxy-auth 选项即可,这样参数就改为:

service_args = [
'--proxy=127.0.0.1:10809',
'--proxy-type=http',
'--proxy-auth=username:password'
]

将 username 和 password 替换为认证所需的用户名和密码即可。

来源:DC_lullaby