爬蟲與反爬蟲的博弈
1 前言
近來這兩三個月,我陸續將自己學到的爬蟲技術分享出來。以標準網路庫 urllib 的用法起筆,接著介紹各種內容提供工具,再到後續的 scrapy 爬蟲框架系列。我的爬蟲分享之旅已經接近尾聲了。本文就來聊聊如何防止爬蟲被 ban 以及如何限制爬蟲。
2 介紹
我們編寫的爬蟲在爬取網站的時候,要遵守 robots 協議,爬取數據做到「盜亦有道」。在爬取數據的過程中,不要對網站的伺服器造成壓力。儘管我們做到這麼人性化。對於網路維護者來說,他們還是很反感爬蟲的。因為爬蟲的肆意橫行意味著自己的網站資料泄露,甚至是自己刻意隱藏在網站的隱私的內容也會泄露。所以,網站維護者會運用各種方法來攔截爬蟲。
3 攻防戰
- 場景一
防
:檢測請求頭中的欄位,比如:User-Agent、referer等欄位。
攻
:只要在 http 請求的 headers 中帶上對於的欄位即可。下圖中的七個欄位被大多數瀏覽器用來初始化所有網路請求。建議將以下所有欄位都帶上。
- 場景二
防
:後台對訪問的 IP 進行統計,如果單個 IP 訪問超過設定的閾值,給予封鎖。雖然這種方法效果還不錯, 但是其實有兩個缺陷。 一個是非常容易誤傷普通用戶, 另一個就是 IP 其實不值錢, 各種代理網站都有出售大量的 IP 代理地址。 所以建議加大頻率周期,每小時或每天超過一定次數屏蔽 IP 一段時間(不提示時間)。
攻
:針對這種情況,可通過使用代理伺服器解決。同時,爬蟲設置下載延遲,每隔幾次請求,切換一下所用代理的IP地址。
- 場景三
防
:後台對訪問進行統計, 如果單個 userAgent 訪問超過閾值, 予以封鎖。這種方法攔截爬蟲效果非常明顯,但是殺傷力過大,誤傷普通用戶概率非常高。所以要慎重使用。
攻
:收集大量瀏覽器的 userAgent 即可。
- 場景四
防
:網站對訪問有頻率限制,還設置驗證碼。增加驗證碼是一個既古老又相當有效果的方法。能夠讓很多爬蟲望風而逃。而且現在的驗證碼的干擾線, 噪點都比較多,甚至還出現了人類肉眼都難以辨別的驗證碼(12306 購票網站)。
攻
:python+tesseract 驗證碼識別庫模擬訓練,或使用類似 tor 匿名中間件(廣度遍歷IP)
- 場景五
防
:網站頁面是動態頁面,採用 Ajax 非同步載入數據方式來呈現數據。這種方法其實能夠對爬蟲造成了絕大的麻煩。
攻
:首先用 Firebug 或者 HttpFox 對網路請求進行分析。如果能夠找到 ajax 請求,也能分析出具體的參數和響應的具體含義。則直接模擬相應的http請求,即可從響應中得到對應的數據。這種情況,跟普通的請求沒有什麼區別。
能夠直接模擬ajax請求獲取數據固然是極好的,但是有些網站把 ajax 請求的所有參數全部加密了。我們根本沒辦法構造自己所需要的數據的請求,請看場景六。
- 場景六
防
:基於 JavaScript 的反爬蟲手段,主要是在響應數據頁面之前,先返回一段帶有JavaScript 代碼的頁面,用於驗證訪問者有無 JavaScript 的執行環境,以確定使用的是不是瀏覽器。例如淘寶、快代理這樣的網站。
這種反爬蟲方法。通常情況下,這段JS代碼執行後,會發送一個帶參數key的請求,後台通過判斷key的值來決定是響應真實的頁面,還是響應偽造或錯誤的頁面。因為key參數是動態生成的,每次都不一樣,難以分析出其生成方法,使得無法構造對應的http請求。
攻
:採用 selenium+phantomJS 框架的方式進行爬取。調用瀏覽器內核,並利用phantomJS 執行 js 來模擬人為操作以及觸發頁面中的js腳本。從填寫表單到點擊按鈕再到滾動頁面,全部都可以模擬,不考慮具體的請求和響應過程,只是完完整整的把人瀏覽頁面獲取數據的過程模擬一遍。
推薦閱讀:
猴哥:Python中「is」和「==」的區別猴哥:爬取網易雲音樂精彩評論猴哥:爬取《Five Hundred Miles》在網易雲音樂的所有評論猴哥:學會運用爬蟲框架 Scrapy (五) —— 部署爬蟲猴哥:學會運用爬蟲框架 Scrapy (四) —— 高效下載圖片猴哥:學會運用爬蟲框架 Scrapy (三)猴哥:學會運用爬蟲框架 Scrapy (二)-爬取 V電影猴哥:我爬取豆瓣影評,告訴你《復仇者聯盟3》在講什麼?猴哥:爬蟲實戰一:爬取噹噹網所有 Python 書籍猴哥:爬蟲實戰二:爬取電影天堂的最新電影本文原創發佈於微信公眾號「極客猴」,歡迎關注第一時間獲取更多原創分享
【極客猴】每周堅持分享 Python 原創乾貨的公眾號。包括基礎入門,進階技巧,網路爬蟲,數據分析, Web 應用開發等,歡迎關注。
推薦閱讀: