1. 程式人生 > >【Python3爬蟲】Scrapy使用IP代理池和隨機User-Agent

【Python3爬蟲】Scrapy使用IP代理池和隨機User-Agent

findall 4.3 sdch 5.0 agen and 由於 付費 status

在使用爬蟲的時候,有時候會看到由於目標計算機積極拒絕,無法連接...,這就是因為我們的爬蟲被識別出來了,而這種反爬蟲主要是通過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了。當然了,由於使用的是免費代理,很可能短時間內就會失效了,可以考慮使用付費代理,效果會好很多。

【Python3爬蟲】Scrapy使用IP代理池和隨機User-Agent