当前位置: 移动技术网 > IT编程>脚本编程>Python > 【Python3爬虫】在Scrapy中使用代理IP和随机User-Agent

【Python3爬虫】在Scrapy中使用代理IP和随机User-Agent

2018年11月07日  | 移动技术网IT编程  | 我要评论

恋爱通告下载,郑州四中,未来日记全集下载

在使用爬虫的时候,有时候会看到由于目标计算机积极拒绝,无法连接...,这就是因为我们的爬虫被识别出来了,而这种反爬虫主要是通过ip识别的,针对这种反爬虫,我们可以搭建一个自己的ip代理池,然后用这些ip去访问网站。

新建一个proxies.py,实现我们自己的代理池,主要模块有获取模块、验证模块和存储模块。

(1)获取模块:爬取网上的免费代理,这一部分我就写了个爬取西刺代理的代码,除了获取网上的代理,还要对代理池中代理进行清洗,因为有些代理会失效;

(2)验证模块:验证我们的代理是否可用,如果不可用就舍弃掉;

(3)存储模块:这一部分写得很简单,就是把可用的代理存储到proxies.txt中。

具体代码如下:

 1 import requests
 2 import re
 3 
 4 
 5 class proxies:
 6     def __init__(self):
 7         self.proxy_list = []
 8         self.headers = {
 9             "user-agent": "mozilla/5.0 (windows nt 10.0; wow64) applewebkit/537.36 (khtml, like gecko) "
10                           "chrome/45.0.2454.101 safari/537.36",
11             'accept-encoding': 'gzip, deflate, sdch',
12         }
13 
14     # 爬取西刺代理的国内高匿代理
15     def get_proxy_nn(self):
16         proxy_list = []
17         res = requests.get("http://www.xicidaili.com/nn", headers=self.headers)
18         ip_list = re.findall('<td>(\d+\.\d+\.\d+\.\d+)</td>', res.text)
19         port_list = re.findall('<td>(\d+)</td>', res.text)
20         for ip, port in zip(ip_list, port_list):
21             proxy_list.append(ip + ":" + port)
22         return proxy_list
23 
24     # 验证代理是否能用
25     def verify_proxy(self, proxy_list):
26         for proxy in proxy_list:
27             proxies = {
28                 "http": proxy
29             }
30             try:
31                 if requests.get('http://www.baidu.com', proxies=proxies, timeout=2).status_code == 200:
32                     print('success %s' % proxy)
33                     if proxy not in self.proxy_list:
34                         self.proxy_list.append(proxy)
35             except:
36                 print('fail %s' % proxy)
37 
38     # 保存到proxies.txt里
39     def save_proxy(self):
40         # 验证代理池中的ip是否可用
41         print("开始清洗代理池...")
42         with open("proxies.txt", 'r', encoding="utf-8") as f:
43             txt = f.read()
44         # 判断代理池是否为空
45         if txt != '':
46             self.verify_proxy(txt.strip().split('\n'))
47         else:
48             print("代理池为空!\n")
49         print("开始存入代理池...")
50         # 把可用的代理添加到代理池中
51         with open("proxies.txt", 'w', encoding="utf-8") as f:
52             for proxy in self.proxy_list:
53                 f.write(proxy + "\n")
54 
55 
56 if __name__ == '__main__':
57     p = proxies()
58     results = p.get_proxy_nn()
59     print("爬取到的代理数量", len(results))
60     print("开始验证:")
61     p.verify_proxy(results)
62     print("验证完毕:")
63     print("可用代理数量:", len(p.proxy_list))
64     p.save_proxy()

运行完后会自动生成一个proxies.txt(如果没有proxies.txt这个文件),打开后可以看到一些可用的代理:

但是这样只是搭建好了我们的代理池,要想使用的话,还要在middleware.py中添加一个类来使用我们的代理ip:

 1 class novelproxymiddleware(object):
 2     def process_request(self, request, spider):
 3         proxy = self.get_random_proxy()
 4         print("request proxy is {}".format(proxy))
 5         request.meta["proxy"] = "http://" + proxy
 6 
 7     def get_random_proxy(self):
 8         import random
 9         with open(proxies.txt的绝对路径, 'r', encoding="utf-8") as f:
10             txt = f.read()
11         return random.choice(txt.split('\n'))

然后还要修改settings.py中的代码:

1 downloader_middlewares = {
2     'novels.middlewares.novelproxymiddleware': 543,
3 }

进行完上述步骤后就能在我们的爬虫中使用代理ip了,如果还想在scrapy中使用随机user-agent的话,可以接着往下看。

首先是在middleware.py中添加如下代码:

 1 class noveluseragentmiddleware(object):
 2     def __init__(self):
 3         self.user_agent_list = [
 4             "mozilla/5.0 (windows nt 6.1; wow64) applewebkit/537.1 (khtml, like gecko) chrome/22.0.1207.1 safari/537.1"
 5             "mozilla/5.0 (windows nt 6.1; wow64) applewebkit/536.6 (khtml, like gecko) chrome/20.0.1092.0 safari/536.6",
 6             "mozilla/5.0 (windows nt 6.2) applewebkit/536.6 (khtml, like gecko) chrome/20.0.1090.0 safari/536.6",
 7             "mozilla/5.0 (windows nt 6.2; wow64) applewebkit/537.1 (khtml, like gecko) chrome/19.77.34.5 safari/537.1",
 8             "mozilla/5.0 (x11; linux x86_64) applewebkit/536.5 (khtml, like gecko) chrome/19.0.1084.9 safari/536.5",
 9             "mozilla/5.0 (windows nt 6.0) applewebkit/536.5 (khtml, like gecko) chrome/19.0.1084.36 safari/536.5",
10             "mozilla/5.0 (windows nt 6.1; wow64) applewebkit/536.3 (khtml, like gecko) chrome/19.0.1063.0 safari/536.3",
11             "mozilla/5.0 (windows nt 5.1) applewebkit/536.3 (khtml, like gecko) chrome/19.0.1063.0 safari/536.3",
12             "mozilla/5.0 (windows nt 6.2) applewebkit/536.3 (khtml, like gecko) chrome/19.0.1062.0 safari/536.3",
13             "mozilla/5.0 (windows nt 6.1; wow64) applewebkit/536.3 (khtml, like gecko) chrome/19.0.1062.0 safari/536.3",
14             "mozilla/5.0 (windows nt 6.2) applewebkit/536.3 (khtml, like gecko) chrome/19.0.1061.1 safari/536.3",
15             "mozilla/5.0 (windows nt 6.1; wow64) applewebkit/536.3 (khtml, like gecko) chrome/19.0.1061.1 safari/536.3",
16             "mozilla/5.0 (windows nt 6.1) applewebkit/536.3 (khtml, like gecko) chrome/19.0.1061.1 safari/536.3",
17             "mozilla/5.0 (windows nt 6.2) applewebkit/536.3 (khtml, like gecko) chrome/19.0.1061.0 safari/536.3",
18             "mozilla/5.0 (x11; linux x86_64) applewebkit/535.24 (khtml, like gecko) chrome/19.0.1055.1 safari/535.24",
19         ]
20 
21     def process_request(self, request, spider):
22         ua = random.choice(self.user_agent_list)
23         print('user-agent:' + ua)
24         request.headers.setdefault('user-agent', ua)

然后修改settings.py中的内容:

1 downloader_middlewares = {
2     'novels.middlewares.noveluseragentmiddleware': 544,
3     'novels.middlewares.novelproxymiddleware': 543,
4 }

这样我们就能在scrapy中使用代理ip和随机user-agent了。当然了,由于使用的是免费代理,很可能短时间内就会失效了,可以考虑使用付费代理,效果会好很多。

如对本文有疑问,请在下面进行留言讨论,广大热心网友会与你互动!! 点击进行留言回复

相关文章:

验证码:
移动技术网