Python爬蟲入門,快速抓取大規模數據(第五部分)

我們已經可以寫出一個簡單的爬蟲了。不幸的是,如果連續運行它一段時間你就會發現,爬蟲已經被網站封掉了。通常網站都會有一定的反爬蟲策略,以避免爬蟲給網站帶來太大的負載。而我們前面的爬蟲示例中,我們每秒就抓取一張網頁,過於頻繁的抓取已經觸發了網站的反爬蟲機制。

這一部分裡我們主要討論一下如何避免觸發網站的反爬蟲機制,當然我們在實現我們自己的爬蟲時也應該考慮如何避免給網站帶來太大的影響。反爬蟲的基本原理很簡單,從所有網站訪問請求中識別出爬蟲發出的訪問請求並阻止這些請求。所以要避免觸發網站的反爬蟲機制,就要使我們爬蟲抓取請求儘量和正常用戶請求一致。

基於HTTP請求特徵的反爬蟲

這種反爬蟲策略就是根據單個請求的特徵(如User-Agent等)來決定是否允許訪問。默認情況下不同的瀏覽器和不同的工具生成HTTP請求時會設置不同的User-Agent。這種類型的反爬蟲措施是很容易繞過,我們可以設置爬蟲請求的User-Agent和其它需要的HTTP請求頭,這樣爬蟲發出的請求就和瀏覽器發出的請求完全一樣,成功的避免觸發這一類的反爬蟲措施。

下面的代碼分別對應設置python requests和phantomjs請求的user-agent。

Python爬蟲入門,快速抓取大規模數據(第五部分)

這裡不得不推薦一下Fiddler這個工具。通過Fiddler抓包觀察,我們可以清楚的看到從我們機器上發出的HTTP請求。我可以比較一下我們爬蟲發出的HTTP請求和從瀏覽器發出HTTP請求是否有區別。如果需要,修改爬蟲使發出的HTTP請求和瀏覽器發出的請求儘量一致。

基於HTTP訪問請求統計的反爬蟲

網站統計從各個IP地址發出的訪問請求數量,如果達到一定的閥值就會觸發反爬蟲策略。這一類策略無法簡單的繞過,所以我們需要做到的就是不要從單個IP地址發出太多訪問請求,拉長同一網站兩次抓取之間的時間間隔。另外,從多個不同IP地址發出訪問請求。具體處理方法包括:

使用代理服務器

python requests允許設置代理服務器,這樣我們的抓取HTTP請求就會從代理服務器發出,而網站看到的是代理服務器的地址。我們可以搭建代理服務器池,通過使用代理服務器來抓取。網絡上也可以找到很多免費的代理服務器,但是穩定性可能是一個問題。

下面的代碼分別對應設置python requests和phantomjs使用代理服務器。

Python爬蟲入門,快速抓取大規模數據(第五部分)

Python爬蟲入門,快速抓取大規模數據(第五部分)

分佈式爬蟲

另一種選擇是分佈式爬蟲,爬蟲程序被部署在不同的機器上,每一臺爬蟲機器擁有不同的IP地址,並且每個爬蟲以比較大的時間間隔抓取取據。

以前面我們實現的爬蟲為例,我們可以部署一臺MySQL數據庫,然後把我們的爬蟲運行於不同的機器上,不同的爬蟲共享MySQL數據存儲。

Python爬蟲入門,快速抓取大規模數據(第五部分)

總結

通過這部分的內容我們的爬蟲可以真正的運行起來採集數據了。在這個爬蟲的基礎上我們可以做更多很多的改進。不管怎樣,爬蟲的基本原理就是我們已經討論過的內容,這個簡單的爬蟲可以幫助我們理解爬蟲的本質。

在接下來的部分裡我們將會看看現有的一些python的爬蟲框架的實現。

往期文章:


分享到:


相關文章: