1. 程式人生 > >防止爬蟲被牆的幾個技巧(總結篇)

防止爬蟲被牆的幾個技巧(總結篇)

  爬蟲的目的就是大規模地、長時間地獲取資料,跟我們正常瀏覽器獲取資料相比,雖然機理相差不大,但總是一個IP去爬網站,大規模集中對伺服器訪問,時間一長就有可能被拒絕。關於爬蟲長時間爬取資料,可能會要求驗證碼,即便是多個賬號輪流爬取仍然會出現要求輸入驗證碼的情況。

技巧一:設定下載等待時間/下載頻率

  大規模集中訪問對伺服器的影響較大,爬蟲可以短時間增大伺服器負載。這裡需要注意的是:設定下載等待時間的範圍控制,等待時間過長,不能滿足短時間大規模抓取的要求,等待時間過短則很有可能被拒絕訪問。
1. 在之前“從url獲取HTML”的方法裡,對於httpGet的配置設定了socket超時和連線connect超時,其實這裡的時長不是絕對的,主要取決於目標網站對爬蟲的控制。
2. 另外,在scrapy爬蟲框架裡,專有引數可以設定下載等待時間download_delay,這個引數可以設定在setting.py裡,也可以設定在spider裡。

技巧二:設定cookies

  cookie其實是儲存在使用者終端的一些被加密的資料,有些網站通過cookies來識別使用者身份,如果某個訪問總是高頻率地發請求,很可能會被網站注意到,被嫌疑為爬蟲,這時網站就可以通過cookie找到這個訪問的使用者而拒絕其訪問。
可以自定義設定cookie策略(防止cookie rejected問題:拒絕寫入cookie)或者禁止cookies。
1. 自定義設定cookies策略(防止cookierejected問題,拒絕寫入cookie)
   在系列一那篇文章裡就有自定義cookie策略設定,但更多的借鑑是官方文件的例子,設定方法其實都大同小異,因為HttpClient-4.3.1元件版本跟以前舊版本的不同,寫法也有不同,另見官方文件:

http://hc.apache.org/httpcomponents-client-4.3.x/tutorial/html/statemgmt.html#d5e553
2. 禁止cookies
   通過禁止cookie,這是客戶端主動阻止伺服器寫入。禁止cookie可以防止可能使用cookies識別爬蟲的網站來ban掉我們。
在scrapy爬蟲中可以設定COOKIES_ENABLES= FALSE,即不啟用cookies middleware,不向web server傳送cookies。

技巧三:修改User-Agent

  最常見的就是偽裝瀏覽器,修改User-Agent(使用者代理)。
  User-Agent是指包含瀏覽器資訊、作業系統資訊等的一個字串,也稱之為一種特殊的網路協議。伺服器通過它判斷當前訪問物件是瀏覽器、郵件客戶端還是網路爬蟲。在request.headers裡可以檢視user-agent,關於怎麼分析資料包、檢視其User-Agent等資訊,這個在前面的文章裡提到過。
   具體方法可以把User-Agent的值改為瀏覽器的方式,甚至可以設定一個User-Agent池(list,陣列,字典都可以),存放多個“瀏覽器”,每次爬取的時候隨機取一個來設定request的User-Agent,這樣User-Agent會一直在變化,防止被牆。

技巧四:修改IP

  其實微博識別的是IP,不是賬號。也就是說,當需要連續抓取很多資料的時候,模擬登入沒有意義。只要是同一個IP,不管怎麼換賬號也沒有用,主要的是換IP。
  web server應對爬蟲的策略之一就是直接將IP或者整個IP段都封掉禁止訪問,當IP被禁封后,轉換到其他IP繼續訪問即可。方法:代理IP、本地IP資料庫(使用IP池)。
1. 從代理IP網站獲取大量IP
如果總是請求代理IP站點也未免有些麻煩,況且某些代理IP站點有時還可能被禁封,當然再換一個代理IP站點也可以,如果你不嫌麻煩的話。
2. 使用IP地址庫
網上也有很多現成可用的IP地址庫,可以存放到本地,如果本地有IP資料庫就方便很多,至少不用每次都去請求代理IP站點了(當然可以一次性把站點內所有代理IP先爬下來儲存好,形成本地IP資料庫),總之獲取IP的方法有很多,不一定非要是通過代理IP站點。關於IP地址庫解析,可以參見我部落格內另外一篇文章:http://blog.csdn.net/dianacody/article/details/38467875
道理相同,把IP解析出來就可以用了。

技巧五:分散式爬取

  分散式爬取的也有很多Githubrepo。原理主要是維護一個所有叢集機器能夠有效分享的分散式佇列。
  使用分散式爬取還有另外一個目的:大規模抓取,單臺機器的負荷很大,況且速度很慢,多臺機器可以設定一個master管理多臺slave去同時爬取。
另外關於網頁判重問題,可以用Bloom Filter。
  Java版微博爬蟲的專案就寫到這裡。之後再寫Python版爬蟲,其實利用python自帶的類庫、甚至成熟的爬蟲框架scrapy,程式碼遠比java版簡潔,有些在java版中用一個方法寫幾十行,在python庫函式可以搞定大部分問題,後續系列將繼續跟進“python版網路爬蟲”。