7-1 爬蟲和反爬的對抗過程以及策略
Ⅰ、爬蟲和反爬蟲基本概念
- 爬蟲:自動獲取網站數據的程序,關鍵是批量的獲取。
- 反爬蟲:使用技術手段防止爬蟲程序的方法。
- 誤傷:反爬蟲技術將普通用戶識別為爬蟲,如果誤傷過高,效果再高也不能用。
- 成本:反爬蟲需要的人力和機器成本。
- 攔截:成功攔截爬蟲,一般攔截率越高,誤傷率越高。
Ⅱ、反爬蟲的目的
- 初級爬蟲----簡單粗暴,不管服務器壓力,容易弄掛網站。
- 數據保護
- 失控的爬蟲----由於某些情況下,忘記或者無法關閉的爬蟲。
- 商業競爭對手
Ⅲ、爬蟲和反爬蟲對抗過程
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 雲打碼實現驗證碼識別
驗證碼識別方法
- 編碼實現(tesseract-ocr)
- 在線打碼----打碼平台(雲打碼、若快)
- 人工打碼
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
本文版權歸作者和博客園共有,歡迎轉載,但未經作者同意必須保留此段聲明,且在文章頁面明顯位置給出原文連接。