閱讀653 返回首頁    go gooseeker集搜客


反爬蟲的應對方法

隨之大數據的火熱,網絡上各種網頁抓取/爬蟲工具蜂擁而來,因而,網頁數據成了大家競爭掠奪的資源,但網站運營者卻要開始保護自己的數據資源,以避免被競爭對手獲取到自己的數據,防止更大的商業損失。下麵總結一下反爬蟲策略及其應對方法。

一、什麼是爬蟲和反爬蟲

爬蟲和反爬蟲作為相生相克的死對頭,無論爬蟲多厲害,都是能被複雜的反爬蟲機製發現,同樣的,無論反爬蟲機製多麼縝密,都是能被高級的網絡爬蟲所攻破,勝負的關鍵就看雙方的資源投入多少了。為了更好地理解爬蟲和反爬蟲機製,下麵有一些定義:

  • 爬蟲:使用任何技術手段,批量獲取網站信息的一種方式。關鍵在於批量。
  • 反爬蟲:使用任何技術手段,阻止別人批量獲取自己網站信息的一種方式。關鍵也在於批量。
  • 誤傷:在反爬蟲的過程中,錯誤的將普通用戶識別為爬蟲。誤傷率高的反爬蟲策略,效果再好也不能用。
  • 攔截:成功地阻止爬蟲訪問。這裏會有攔截率的概念。通常來說,攔截率越高的反爬蟲策略,誤傷的可能性就越高。因此需要做個權衡。

所以,我們可以知道,爬蟲有一個最基本的特征就是批量,而反爬蟲機製也是根據這個特征來做判斷的,但反爬蟲還是一個權衡利弊的選擇,既要較低的誤傷率,又要較高的攔截率,這也是它的漏洞。關於網站為什麼以及如何製定反爬蟲策略,可以看攜程酒店技術部總結的關於反爬蟲的心得體會。

二、反爬蟲方法及其應對

一般網站從三個方麵反爬蟲:請求網站訪問時的請求頭Headers,用戶行為,目標網站的目錄和數據加載方式。前兩個方麵可以說是反爬蟲策略中最為常見的,而第三個則是應用ajax(異步加載)的方式加載頁麵目錄或者內容,增大爬蟲在對目標網站形成訪問之後獲取數據的難度。

但是僅僅檢驗一下請求頭或者做幾個ip限製顯然無法達到網站運營者對anti-spam的要求,所以更進一步的反製措施也不少。最主要的大概有:Cookie限製,驗證碼反爬蟲,以及Noscript。

2.1 通過Headers反爬蟲

從用戶請求的Headers反爬蟲是最常見的反爬蟲策略。由於正常用戶訪問網站時是通過瀏覽器訪問的,所以目標網站通常會在收到請求時校驗Headers中的User-Agent字段,如果不是攜帶正常的User-Agent信息的請求便無法通過請求。還有一部分網站為了防盜鏈,還會校驗請求Headers中的Referer字段。

如果遇到了這類反爬蟲機製,可以直接在自己寫的爬蟲中添加Headers,將瀏覽器的User-Agent複製到爬蟲的Headers中;另外通過對請求的抓包分析,將Referer值修改為目標網站域名,就能很好的繞過。

用集搜客爬蟲的話,是不用擔心如何添加或修改Headers,因為集搜客爬蟲本身就內嵌了一個瀏覽器,自帶Headers,能夠完美地繞過這種反爬蟲機製。

2.2 基於用戶行為反爬蟲

還有一些網站會通過用戶的行為來檢測網站的訪問者是否是爬蟲,例如同一IP短時間內多次訪問同一頁麵,或者同一賬戶短時間內多次進行相同操作。

大多數網站都是前一種情況,對於這種情況有兩種策略:

1)使用代理ip。例如可以專門寫一個在網上抓取可用代理ip的腳本,然後將抓取到的代理ip維護到代理池中供爬蟲使用,當然,實際上抓取的ip不論是免費的還是付費的,通常的使用效果都極為一般,如果需要抓取高價值數據的話也可以考慮購買寬帶adsl撥號的VPS,如果ip被目標網站被封掉,重新撥號即可。

2)降低請求頻率。例如每個一個時間段請求一次或者請求若幹次之後sleep一段時間。由於網站獲取到的ip是一個區域網的ip,該ip被區域內的所有人共享,因此這個間隔時間並不需要特別長

對於第二種情況,可以在每次請求後隨機間隔幾秒再進行下一次請求。對於有邏輯漏洞的網站,可以通過請求幾次,退出登錄,重新登錄,繼續請求來繞過同一賬號短時間內不能多次進行相同請求的限製,如果能有多個賬戶,切換使用,效果更佳。

集搜客爬蟲的火狐插件版是安裝在火狐瀏覽器上的,所有訪問行為都會被加密記錄在火狐瀏覽器中,通過定期清理cookies、切換訪問賬號、控製采集速度、更換ip地址,就可以避開這種反爬蟲機製。另外,集搜客也準備開發ip代理功能,讓采集數據變得更加便捷順暢。

2.3 動態頁麵的反爬蟲

上述的幾種情況大多都是出現在靜態頁麵,但是對於動態網頁,我們需要爬取的數據是通過ajax請求得到,或者通過JavaScript生成的。首先用Firebug或者HttpFox對網絡請求進行分析。如果能夠找到ajax請求,也能分析出具體的參數和響應的具體含義,我們就能采用上麵的方法,直接利用requests或者urllib2模擬ajax請求,對響應的json進行分析得到需要的數據。

能夠直接模擬ajax請求獲取數據固然是極好的,但是有些網站把ajax請求的所有參數全部加密了。我們根本沒辦法構造自己所需要的數據的請求。還有一些嚴防死守的網站,除了加密ajax參數,它還把一些基本的功能都封裝了,全部都是在調用自己的接口,而接口參數都是加密的。

遇到這樣的網站,我們就不能用上麵的方法了,通過selenium+phantomJS框架,調用瀏覽器內核,並利用phantomJS執行js來模擬人為操作以及觸發頁麵中的js腳本。從填寫表單到點擊按鈕再到滾動頁麵,全部都可以模擬,不考慮具體的請求和響應過程,隻是完完整整的把人瀏覽頁麵獲取數據的過程模擬一遍。用這套框架幾乎能繞過大多數的反爬蟲,因為它不是在偽裝成瀏覽器來獲取數據(上述的通過添加 Headers一定程度上就是為了偽裝成瀏覽器),它本身就是瀏覽器,phantomJS就是一個沒有界麵的瀏覽器,隻是操控這個瀏覽器的不是人。

集搜客爬蟲通過設置連續動作,實現點擊、輸入、提交、選擇、懸浮、滾屏等瀏覽行為,完整地模擬人瀏覽網頁的操作,它是實實在在的瀏覽器+智能模擬行為,能夠獲取到大多數動態網頁信息。

2.4 Cookie限製

和Headers校驗的反爬蟲機製類似,當用戶向目標網站發送請求時,會再請求數據中攜帶Cookie,網站通過校驗請求信息是否存在Cookie,以及校驗Cookie的值來判定發起訪問請求的到底是真實的用戶還是爬蟲,第一次打開網頁會生成一個隨機cookie,如果再次打開網頁這個Cookie不存在,那麼再次設置,第三次打開仍然不存在,這就非常有可能是爬蟲在工作了。

而Cookie校驗和Headers的區別在於,用戶發送的Headers的內容形式是固定的可以被輕易偽造的,Cookie則不然。原因是由於,我們在分析瀏覽器請求網站訪問的過程中所分析得到的Cookie往往都是經過相關的js等過程已經改變了domain的Cookie,假如直接手動修改爬蟲攜帶的Cookie去訪問對應的網頁,由於攜帶的Cookie已經是訪問之後的domain而不是訪問之前的domain,所以是無法成功模擬整個流程的,這種情況必然導致爬蟲訪問頁麵失敗。

分析Cookie,可能會攜帶大量的隨機哈希字符串,或者不同時間戳組合的字符串,並且會根據每次訪問更新domain的值。對這種限製,首先要在對目標網站抓包分析時,必須先清空瀏覽器的Cookie,然後在初次訪問時,觀察瀏覽器在完成訪問的過程中的請求細節(通常會在這一過程中發生若幹次301/302轉跳,每次轉跳網站返回不同的Cookie給瀏覽器然後在最後一次轉跳中請求成功)。在抓包完成對請求細節的分析之後,再在爬蟲上模擬這一轉跳過程,然後截取Cookie作為爬蟲自身攜帶的Cookie,這樣就能夠繞過Cookie的限製完成對目標網站的訪問了。

集搜客爬蟲是通過自帶瀏覽器來訪問網頁的,采集數據訪問網頁的過程與用瀏覽器訪問的過程是一樣的,所以,不用擔心cookie限製導致訪問失敗,但是,建議要定期清理cookies,可以更好地避開基於用戶行為的反爬蟲監測。

2.5 驗證碼限製

這是一個相當古老但卻不失有效性的反爬蟲策略。更早的時候,這種驗證碼可以通過OCR技術進行簡單的圖像識別破解,但是現在來說,驗證碼的幹擾線,噪點已經多到肉眼都無法輕易識別的地步。所以目前而言,由於OCR技術發展不力,驗證碼技術反而成為了許多網站最有效的手段之一。

驗證碼除了識別難題之外,還有另外一個值得注意的問題。現在有許多網站都在使用第三方驗證碼服務。當用戶打開目標網站的登錄頁麵時,登錄頁麵顯示的驗證碼是從第三方(比如阿裏雲)提供的鏈接加載的,這時候我們在模擬登錄的時候,需要多一步從網頁提供的第三方鏈接抓取驗證碼的步驟,而這一步常常暗含著陷阱。以阿裏雲提供的驗證碼服務為例,登錄頁麵的源代碼會顯示阿裏雲提供的第三方鏈接,但是當匹配出這個鏈接進行驗證碼抓取的時候我們會發現驗證碼是無效的。當仔細分析抓包的請求數據之後,發現正常瀏覽器在請求驗證碼時,會多帶一個ts參數,而這個參數是由當前時間戳產生的,但是並不是完全的時間戳,而是時間戳四舍五入保留九位數字之後的字符串,對待這種第三方服務隻能是細心加運氣,三分天注定七分不信命來猜一發了。還有另外一種特殊的第三方驗證碼,所謂的拖動驗證,隻能說,互聯網創業有三種模式2b,2c,2vc。

集搜客爬蟲既可以連打碼平台,也可以自動識別滑塊驗證碼,滑塊驗證碼對用戶行為進行鑒別,GooSeeker V7.0.1版本具有錄製用戶行為功能,通過大量分析用戶行為樣本,抽取行為特征,利用機器學習算法,實現了高通過率的滑塊驗證碼的識別程序。

最後更新:2017-01-09 14:08:08

  上一篇:go Python讀取PDF內容
  下一篇:go 集微庫-集搜客GooSeeker微博采集工具箱上線啦