反爬蟲技術方案

https://blog.csdn.net/yixuandong9010/article/details/75861233html

 

隨之大數據的火熱,網絡上各類網頁抓取/爬蟲工具蜂擁而來,於是,網頁數據成了你們競爭掠奪的資源,但網站運營者卻要開始保護本身的數據資源,以免被競爭對手獲取到本身的數據,防止更大的商業損失。下面總結一下反爬蟲策略及其應對方法。 
1、什麼是爬蟲和反爬蟲ajax

爬蟲和反爬蟲做爲相生相剋的死對頭,不管爬蟲多厲害,都是能被複雜的反爬蟲機制發現,一樣的,不管反爬蟲機制多麼縝密,都是能被高級的網絡爬蟲所攻破,勝負的關鍵就看雙方的資源投入多少了。爲了更好地理解爬蟲和反爬蟲機制,下面有一些定義: 
爬蟲:使用任何技術手段,批量獲取網站信息的一種方式。關鍵在於批量。 反爬蟲:使用任何技術手段,阻止別人批量獲取本身網站信息的一種方式。關鍵也在於批量。 
誤傷:在反爬蟲的過程當中,錯誤的將普通用戶識別爲爬蟲。誤傷率高的反爬蟲策略,效果再好也不能用。 
攔截:成功地阻止爬蟲訪問。這裏會有攔截率的概念。一般來講,攔截率越高的反爬蟲策略,誤傷的可能性就越高。所以須要作個權衡。 
因此,咱們能夠知道,爬蟲有一個最基本的特徵就是批量,而反爬蟲機制也是根據這個特徵來作判斷的,但反爬蟲仍是一個權衡利弊的選擇,既要較低的誤傷率,又要較高的攔截率,這也是它的漏洞。關於網站爲何以及如何制定反爬蟲策略,能夠看攜程酒店技術部總結的關於反爬蟲的心得體會。 
2、反爬蟲方法及其應對json

通常網站從三個方面反爬蟲:請求網站訪問時的請求頭Headers,用戶行爲,目標網站的目錄和數據加載方式。前兩個方面能夠說是反爬蟲策略中最爲常見的,而第三個則是應用ajax(異步加載)的方式加載頁面目錄或者內容,增大爬蟲在對目標網站造成訪問以後獲取數據的難度。 
可是僅僅檢驗一下請求頭或者作幾個ip限制顯然沒法達到網站運營者對anti-spam的要求,因此更進一步的反制措施也很多。最主要的大概有:Cookie限制,驗證碼反爬蟲,以及Noscript。 
2.1 經過Headers反爬蟲 
從用戶請求的Headers反爬蟲是最多見的反爬蟲策略。因爲正經常使用戶訪問網站時是經過瀏覽器訪問的,因此目標網站一般會在收到請求時校驗Headers中的User-Agent字段,若是不是攜帶正常的User-Agent信息的請求便沒法經過請求。還有一部分網站爲了防盜鏈,還會校驗請求Headers中的Referer字段。 若是遇到了這類反爬蟲機制,能夠直接在本身寫的爬蟲中添加Headers,將瀏覽器的User-Agent複製到爬蟲的Headers中;另外經過對請求的抓包分析,將Referer值修改成目標網站域名,就能很好的繞過。 
2.2 基於用戶行爲反爬蟲 
還有一些網站會經過用戶的行爲來檢測網站的訪問者是不是爬蟲,例如同一IP短期內屢次訪問同一頁面,或者同一帳戶短期內屢次進行相同操做。 大多數網站都是前一種狀況,對於這種狀況有兩種策略: 
1)使用代理ip。例如能夠專門寫一個在網上抓取可用代理ip的腳本,而後將抓取到的代理ip維護到代理池中供爬蟲使用,固然,實際上抓取的ip不管是免費的仍是付費的,一般的使用效果都極爲通常,若是須要抓取高價值數據的話也能夠考慮購買寬帶adsl撥號的VPS,若是ip被目標網站被封掉,從新撥號便可。 
2)下降請求頻率。例如每一個一個時間段請求一次或者請求若干次以後sleep一段時間。因爲網站獲取到的ip是一個區域網的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的限制完成對目標網站的訪問了。 
2.5 驗證碼限制 
這是一個至關古老但卻不失有效性的反爬蟲策略。更早的時候,這種驗證碼能夠經過OCR技術進行簡單的圖像識別破解,可是如今來講,驗證碼的干擾線,噪點已經多到肉眼都沒法輕易識別的地步。因此目前而言,因爲OCR技術發展不力,驗證碼技術反而成爲了許多網站最有效的手段之一。 
驗證碼除了識別難題以外,還有另一個值得注意的問題。如今有許多網站都在使用第三方驗證碼服務。當用戶打開目標網站的登陸頁面時,登陸頁面顯示的驗證碼是從第三方(好比阿里雲)提供的連接加載的,這時候咱們在模擬登陸的時候,須要多一步從網頁提供的第三方連接抓取驗證碼的步驟,而這一步經常暗含着陷阱。以阿里雲提供的驗證碼服務爲例,登陸頁面的源代碼會顯示阿里雲提供的第三方連接,可是當匹配出這個連接進行驗證碼抓取的時候咱們會發現驗證碼是無效的。當仔細分析抓包的請求數據以後,發現正常瀏覽器在請求驗證碼時,會多帶一個ts參數,而這個參數是由當前時間戳產生的,可是並非徹底的時間戳,而是時間戳四捨五入保留九位數字以後的字符串,對待這種第三方服務只能是細心加運氣,三分天註定七分不信命來猜一發了。還有另一種特殊的第三方驗證碼,所謂的拖動驗證,只能說,互聯網創業有三種模式2b,2c,2vc。瀏覽器

排名前50的開源Web爬蟲用於數據挖掘

相關文章
相關標籤/搜索