1. 程式人生 > >Python爬蟲開發(五):反爬蟲措施以及爬蟲編寫注意事項

Python爬蟲開發(五):反爬蟲措施以及爬蟲編寫注意事項

0×01 介紹

本人對於Python學習建立了一個小小的學習圈子,為各位提供了一個平臺,大家一起來討論學習Python。歡迎各位到來Python學習群:960410445一起討論視訊分享學習。Python是未來的發展方向,正在挑戰我們的分析能力及對世界的認知方式,因此,我們與時俱進,迎接變化,並不斷的成長,掌握Python核心技術,才是掌握真正的價值所在。
 

0×02 問題的分類

那麼,由我們上面的敘述,對於爬蟲的策略也就有:

1.    順從但減輕損失

2.    爬蟲反制

0×03 順從的藝術

可能有人會覺得可笑,為什麼要順從?很簡單,記得我們以前使用的sitemap麼?可以說它就是為了爬蟲服務,除此之外,我們還要知道推特的開放平臺提供了收費的爬蟲介面,google也提供了收費的爬蟲介面。那麼大家覺得這些牆外的事情離我們還是非常的遠,那麼我就來舉一些例子好了,我們經常網購的朋友都使用京東對吧?也許大家還不知道京東有自己的開放平臺,可以供爬蟲或者是希望獲取京東內商家或者商品資訊的開發者:

Clipboard Image.png

然後我們開啟API頁面的商品API頁面:

Clipboard Image.png

我們發現它提供了不少易用的介面,開發者註冊以後可以使用,或者處理一下丟給爬蟲去使用。同樣的淘寶也有相應的平臺,但是應該是收費的,就是淘寶開放平臺,要在聚石塔呼叫API才會生效:

Clipboard Image.png

Clipboard Image.png

大家可以看到,如果你希望獲取的是京東或者淘寶的資訊,怎麼辦?自己費力去解析網頁並不是一個好辦法,再者說,在爬蟲開發四中,我們舉的例子就是淘寶的例子,一般的爬蟲是沒有辦法爬到淘寶頁面的,這也就從某種程度上解釋了為什麼百度很難收到淘寶的商品資訊什麼的,當然不是說百度沒有動態爬蟲這項技術。

讀者會發現,如果我們要使用這些爬蟲,就要遵守商家約定的規則,註冊甚至是付費才能使用。

其實這就是一個本部分講的一個平衡點,作為一隻爬蟲,如果想要在某個網站工作,就必須遵守網站的規則(robots.txt協議,開放平臺API協議)。

當然如果爬蟲製造者覺得不爽,當然可以有別的辦法啊,但是代價就是你要針對這個網站寫不少爬蟲程式碼,增加自己的開發成本,也不能說得不償失,只是你有了汽車為什麼還偏愛自行車呢?當然自行車和汽車也是有優劣之分的:頂多也就是比賽競速用的自行車和一輛小奧拓的差別吧。

0×04 反爬蟲

但是你是真的真的很討厭爬蟲,你恨不得有一萬種措施擋住爬蟲,那麼同樣的,有些措施可以起到很好的效果,有些措施可能起不了多大的作用,那麼我們現在就來講一下反爬蟲的幾重措施。

1. IP限制

如果是個人編寫的爬蟲,IP可能是固定的,那麼發現某個IP請求過於頻繁並且短時間內訪問大量的頁面,有爬蟲的嫌疑,作為網站的管理或者運維人員,你可能就得想辦法禁止這個IP地址訪問你的網頁了。那麼也就是說這個IP發出的請求在短時間內不能再訪問你的網頁了,也就暫時擋住了爬蟲。

2. User-Agent

User-Agent是使用者訪問網站時候的瀏覽器的標識

下面我列出了常見的幾種正常的系統的User-Agent大家可以參考一下,

Clipboard Image.png

並且在實際發生的時候,根據瀏覽器的不同,還有各種其他的User-Agent,我舉幾個例子方便大家理解:

safari 5.1 – MAC

 

User-Agent:Mozilla/5.0 (Macintosh; U; IntelMac OS X 10_6_8; en-us) AppleWebKit/534.50 (KHTML, like Gecko) Version/5.1Safari/534.50

 

Firefox 4.0.1 – MAC

 

User-Agent: Mozilla/5.0 (Macintosh; IntelMac OS X 10.6; rv:2.0.1) Gecko/20100101 Firefox/4.0.1

 

Firefox 4.0.1 – Windows

 

User-Agent:Mozilla/5.0 (Windows NT 6.1;rv:2.0.1) Gecko/20100101 Firefox/4.0.1

 

同樣的也有很多的合法的User-Agent,只要使用者訪問不是正常的User-Agent極有可能是爬蟲再訪問,這樣你就可以針對使用者的User-Agent進行限制了。

3、 驗證碼反爬蟲

這個辦法也是相當古老並且相當的有效果,如果一個爬蟲要解釋一個驗證碼中的內容,這在以前通過簡單的影象識別是可以完成的,但是就現在來講,驗證碼的干擾線,噪點都很多,甚至還出現了人類都難以認識的驗證碼(某二三零六)。

Clipboard Image.png

嗯,如果一個爬蟲要訪問的頁面提示要輸入驗證碼,那麼問題就來了,不是所有的爬蟲都裝備了影象識別技術啊。其實大家要問了,爬蟲處理這些登入頁面有什麼意義呢?除非你是想爆破密碼或者是刷xxx什麼的。但是真的有人把驗證碼用在反爬蟲上的麼?事實上確實有,Google就在使用,如果有使用google經驗的讀者會發現自己在愉快查google,特別是使用vpn或者是各種科學上網工具的時候,經常會提示你google想知道你是不是一個人(不是人還能是什麼?)

Clipboard Image.png

不是所有的爬蟲都可以配備OCR技術,所以自然這樣可以很好的抵擋爬蟲。(當然如果你有興趣編寫一個具有機器學習的OCR技術的爬蟲的話,這樣可能會有一些正確率,筆者有一段時間還是很想通過OCR技術解決驗證碼問題,但是嘗試一點獲得失敗之後並沒有新的進展,於是就放棄了)

4. Ajax非同步載入

網頁的不希望被爬蟲拿到的資料使用Ajax動態載入,這樣就為爬蟲造成了絕大的麻煩,如果一個爬蟲不具備js引擎,或者具備js引擎,但是沒有處理js返回的方案,或者是具備了js引擎,但是沒辦法讓站點顯示啟用指令碼設定。基於這些情況,ajax動態載入反制爬蟲還是相當有效的。具體的例子有很多,比如淘寶(在上一篇文章中我們有解釋)。.

5. Noscript標籤的使用

<noscript>標籤是在瀏覽器(或者使用者瀏覽標識),沒有啟動指令碼支援的情況下觸發的標籤,在低階爬蟲中,基本都沒有配置js引擎,通常這種方式和Ajax非同步載入同時使用。用於保護自己不想讓爬蟲接觸的資訊。

6. Cookie限制

第一次開啟網頁會生成一個隨機cookie,如果再次開啟網頁這個cookie不存在,那麼再次設定,第三次開啟仍然不存在,這就非常有可能是爬蟲在工作了。很簡單,在三番屢次沒有帶有該帶的cookie,就禁止訪問。

0×05 Anti-Anti-Spider

這一部分筆者並不計劃深入講解,因為如果讀過筆者前一部分爬蟲文章的讀者,都會知道,筆者基本把同一級別的主流爬蟲解決方案都說的很清楚了,如果要問scrapy什麼的爬蟲框架,大家自行歸類,從最底層到最頂層大家都是有了這些概念,我們接下來的介紹儘量從簡。

接下來我們就討論一些關於反爬蟲反制的措施。其實在這段時間內,我總結出一條用於爬蟲編寫的核心定律:

像一個人一樣瀏覽網頁,像一臺機器一樣分析資料

接下來我們就討論一下在整個一系列文章出現的解決方案能突破幾種限制(Python2):

1. Urllib是最弱的web網頁瀏覽模式,User-Agent,cookie,ip都無法解決;

2. Requests模組與urllib2,urllib3,基本可以解決靜態網頁的所有問題,但是沒辦法解決IP限制,如果需要解決IP限制則需要使用代理,如果需要解決驗證碼問題,則需要自己配置OCR;

3. Selenium+瀏覽器:無法解決驗證碼的問題,效率低,速度慢;

4. Ghost.py無法解決驗證碼問題,效率低,速度慢。

從原理上來講,selenium或者ghost.py模式已經是完全模仿人類瀏覽網頁方式了,事實上,他們就是,因為對於大多數人來:講只有人類才會開啟一個瀏覽器瀏覽網頁,檢視網頁各種資訊,click甚至是send_key.

具體來講,建議使用Requests,學習Requests模組的使用,必要時使用selenium或者ghost.py。這樣,面對所有的爬蟲,也許就只有驗證碼和IP會比較傷腦筋了,但是對於IP限制來講,我們並不畏懼,有經驗的朋友可以很快構造出代理模式瀏覽其他網頁,多久換一次IP就需要具體調查目標網頁的限制閾值了。

那麼也就是說驗證碼是一個巨大的門檻。誠然,的確是的,很多人致力多年研究繞過驗證碼。可以說是卓有成效也可以說是一籌莫展。目前比較成熟的方法就是使用機器學習識別驗證碼內容。但是一旦驗證碼識別方式改動以後,比如現在12306的驗證碼,這個著實是難以處理。但是大家也不要灰心,繞過驗證碼就一定要認認真真填寫麼?筆者在這裡可以負責任地講,驗證碼的繞過在很多的時候是通過web應用邏輯錯誤繞過的。

0×06 爬蟲編寫注意事項

在這一部分,筆者希望就自己的經驗給大家編寫爬蟲提供比較可行的建議,也為大家提一個醒:

1. 道德問題,是否遵守robots協議;

2. 小心不要出現卡死在死迴圈中,儘量使用urlparser去解析分離url決定如何處理,如果簡單的想當然的分析url很容易出現死迴圈的問題;

3. 單頁面響應超時設定,預設是200秒,建議調短,在網路允許的條件下,找到一個平衡點,避免所有的爬蟲執行緒都在等待200,結果出現效率降低;

4. 高效準確的判重模式,如果判重出現問題,就會造成訪問大量已經訪問過的頁面浪費時間;

5. 可以採用先下載,後分析的方法,加快爬蟲速度;

6. 在非同步程式設計的時候要注意資源死鎖問題;

7. 定位元素要精準(xpath)儘量避免dirty data。

這些問題都是筆者在學習的過程中,遇到的問題,拿出來給大家分享,希望對大家進行資料探勘學習有所幫助。

0×07 反饋與問題

希望大家提出自己的意見,本系列大多數時間都在從微觀的角度講爬蟲各個部件的解決方案。如果大家想知道一個完整的爬蟲開發流程,歡迎留言給我,如果讀者有興趣,我還是可以從架構設計講起,到具體的實現,再到除錯執行,改造成分散式爬蟲解決方案。