第7章 Scrapy突破反爬蟲的限制


7-1 爬蟲和反爬的對抗過程以及策略

Ⅰ、爬蟲和反爬蟲基本概念

  1. 爬蟲:自動獲取網站數據的程序,關鍵是批量的獲取。
  2. 反爬蟲:使用技術手段防止爬蟲程序的方法。
  3. 誤傷:反爬蟲技術將普通用戶識別為爬蟲,如果誤傷過高,效果再高也不能用。
  4. 成本:反爬蟲需要的人力和機器成本。
  5. 攔截:成功攔截爬蟲,一般攔截率越高,誤傷率越高。

Ⅱ、反爬蟲的目的

  1. 初級爬蟲----簡單粗暴,不管服務器壓力,容易弄掛網站。
  2. 數據保護
  3. 失控的爬蟲----由於某些情況下,忘記或者無法關閉的爬蟲。
  4. 商業競爭對手

Ⅲ、爬蟲和反爬蟲對抗過程

7-2 scrapy架構源碼分析

原理圖:

我最早接觸scrapy的時候就是看這張原理圖,如下圖

現在有新的原理圖,更加直觀,如下圖

看了視頻講的源碼解析,看一遍根本看不懂,后期還要多看叫上項目的練習才行。

7-3 Requests和Response介紹

可以看scrapy文檔: http://scrapy-chs.readthedocs.io/zh_CN/latest/index.html 查看相關的說明即可。

模擬登陸后,Request會自動傳遞cookies,不用我們添加。

7-4~5 通過downloadmiddleware隨機更換user-agent

這是個模版以后直接拿來用即可

 1 #middlewares.py文件
 2 from fake_useragent import UserAgent #這是一個隨機UserAgent的包,里面有很多UserAgent
 3 class RandomUserAgentMiddleware(object):
 4     def __init__(self, crawler):
 5         super(RandomUserAgentMiddleware, self).__init__()
 6 
 7         self.ua = UserAgent()
 8         self.ua_type = crawler.settings.get('RANDOM_UA_TYPE', 'random') #從setting文件中讀取RANDOM_UA_TYPE值
 9 
10     @classmethod
11     def from_crawler(cls, crawler):
12         return cls(crawler)
13 
14     def process_request(self, request, spider):
15         def get_ua():
16             '''Gets random UA based on the type setting (random, firefox…)'''
17             return getattr(self.ua, self.ua_type) 
18 
19         user_agent_random=get_ua()
20         request.headers.setdefault('User-Agent', user_agent_random) #這樣就是實現了User-Agent的隨即變換
1 #settings.py文件
2 DOWNLOADER_MIDDLEWARES = {
3    'Lagou.middlewares.RandomUserAgentMiddleware': 543,
4    'scrapy.downloadermiddlewares.useragent.UserAgentMiddleware':None, #這里要設置原來的scrapy的useragent為None,否者會被覆蓋掉
5 }
6 RANDOM_UA_TYPE='random'

7-6~8 scrapy實現ip代理池

這是個模版以后直接拿來用即可

 1 #middlewares.py文件
 2 class RandomProxyMiddleware(object):
 3     '''動態設置ip代理'''
 4     def process_request(self,request,spider):
 5         get_ip = GetIP() #這里的函數是傳值ip的
 6         request.meta["proxy"] = get_ip
 7         #例如
 8         #get_ip = GetIP() #這里的函數是傳值ip的
 9         #request.meta["proxy"] = 'http://110.73.54.0:8123'
10 
11 
12 #settings.py文件
13 DOWNLOADER_MIDDLEWARES = {
14    'Lagou.middlewares.RandomProxyMiddleware':542,
15    'Lagou.middlewares.RandomUserAgentMiddleware': 543,
16    'scrapy.downloadermiddlewares.useragent.UserAgentMiddleware':None, #這里要設置原來的scrapy的useragent為None,否者會被覆蓋掉
17 }

1.sql語言取出隨機記錄:在此是隨機取出一條記錄是ip和端口組成代理IP

1 select ip,port from proxy_ip
2 order by rand()
3 limit 1

2.使用xpath選擇器:

可以使用scrapy中的selector,代碼如下:

1 from scrapy.selector import Selector
2 html=requests.get(url)
3 Selector=Selector(text=html.text)
4 Selector.xpath()

3.if __name__ == "__main__"問題

如果沒有這個,調用時會默認運行以下命令

1  if __name__ == "__main__":
2      get_ip=GetIp()
3      get_ip.get_random_ip()

7-9 雲打碼實現驗證碼識別

驗證碼識別方法

  1. 編碼實現(tesseract-ocr)
  2. 在線打碼----打碼平台(雲打碼、若快)
  3. 人工打碼

7-10 cookie禁用、自動限速、自定義spider的settings

如果用不到cookies的,就不要讓對方知道你的cookies--設置---COOKIES_ENABLED = False

自定義setting中的參數可以這樣寫:

1 #在spider.py文件中
2 custom_settings={
3      "COOKIES_ENABLED":True,
4       "":"",
5       "":"",
6 }

作者:今孝

出處:http://www.cnblogs.com/jinxiao-pu/p/6762636.html

本文版權歸作者和博客園共有,歡迎轉載,但未經作者同意必須保留此段聲明,且在文章頁面明顯位置給出原文連接。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM