爬虫学习(7)

  有些网站会有反爬虫措施,比如服务器会检测某个IP在单位时间内的请求次数,如果超过某个阈值,那么服务器会拒绝服务,返回错误信息,也就是我们俗称的“封IP”。遇到这种情况,我们就需要使用代理,应对这一封IP的举措。

设置代理

  可以自己在本地搭建代理,也可以去网上找免费的或者付费的代理,最好是选择高匿名代理,付费的比免费的好用。
  这里,我从https://www.kuaidaili.com/free/ 上查找可用的免费代理,但是不保证时效性,使用之前需要自己先试验。

requests代理设置

  requests的代理设置非常简单,只需要构造代理字典,通过proxies传参即可。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
import requests
proxy = '221.218.102.146:42667'
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)
···
运行结果如下:
```html
{
"args": {},
"headers": {
"Accept": "*/*",
"Accept-Encoding": "gzip, deflate",
"Connection": "close",
"Host": "httpbin.org",
"User-Agent": "python-requests/2.18.4"
},
"origin": "221.218.102.146",
"url": "http://httpbin.org/get"
}

  可以看到origin显示的是代理的ip,这说明代理已经设置成功

Selenium代理设置

  这里以常用的Chrome为例,通过ChromeOptions设置代理,在创建Chrome对象时用chrome_options传参。

1
2
3
4
5
6
from selenium import webdriver
proxy = '221.218.102.146:42667'
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')

运行结果如下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
{
"args": {},
"headers": {
"Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8",
"Accept-Encoding": "gzip, deflate",
"Accept-Language": "zh-CN,zh;q=0.9",
"Connection": "close",
"Host": "httpbin.org",
"Upgrade-Insecure-Requests": "1",
"User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.110 Safari/537.36"
},
"origin": "221.218.102.146",
"url": "http://httpbin.org/get"
}

  origin就是我们使用的代理地址,设置成功。

代理池的维护

  有时候,我们会需要一个代理池来保证爬虫的有效进行。设置代理池主要分为四个模块:
1.存储模块:存储抓取的代理,保证不重复,并且可以标识可用程度,推荐使用Redis,可以用Sorted Set实现排序
2.获取模块:从各大代理网站抓取代理,IP+端口的形式,尽量抓取高匿代理
3.检测模块:定时检测数据库中的代理,是否可用,可以设置一个检测链接
4.接口模块:可以提供一个Web API接口,通过访问接口拿到可用代理,还可以设置随机返回某个可用代理;这一功能可以直接从数据库中选择可用代理,只不过是要配置连接数据库,不是特别安全和方便

付费代理

  相对于免费代理来说,付费代理稳定性更高,所以更推荐。