【Python3爬虫】Scrapy使用IP代理池和随机User-Agent,,在使用爬虫的时候,有
【Python3爬虫】Scrapy使用IP代理池和随机User-Agent,,在使用爬虫的时候,有
在使用爬虫的时候,有时候会看到由于目标计算机积极拒绝,无法连接...,这就是因为我们的爬虫被识别出来了,而这种反爬虫主要是通过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_list23 24 # 验证代理是否能用25 def verify_proxy(self, proxy_list):26 for proxy in proxy_list:27 proxies = {28 "http": proxy29 }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了。当然了,由于使用的是免费代理,很可能短时间内就会失效了,可以考虑使用付费代理,效果会好很多。
【Python3爬虫】Scrapy使用IP代理池和随机User-Agent
相关内容
- #MySQL for Python(MySQLdb) Note,,#MySQL for
- mysql与python3交互,,ubuntu端安装s
- PYTHON访问数据库,,PYTHON DB
- python生成RSS(PyRSS2Gen),,既然能够用pytho
- python与redis交互,,前言首先我使用电脑为
- python重定向原理及实例,python重定向实例,1. 前言为了在
- BioPython-2,,关于Seq对象的内容
- python基础数据类型,,1,int #数字(
- python---django中orm的使用(4)字段,参数(on_delete重点)
- 关于python -os.mkdir(str)方法的使用记录,python-os.mkdir,这几
评论关闭