常見的反爬蟲urllib技術(shù)分享
爬蟲和反爬的對抗一直在進行著…為了幫助更好的進行爬蟲行為以及反爬,今天就來介紹一下網(wǎng)頁開發(fā)者常用的反爬手段。
通過robots.txt來限制爬蟲:
爬蟲都遵守著一個協(xié)議:robots.txt
robots.txt(統(tǒng)一小寫)是一種存放于網(wǎng)站根目錄下的ASCII編碼的文本文件,它通常告訴網(wǎng)絡搜索引擎的漫游器(又稱網(wǎng)絡蜘蛛),此網(wǎng)站中的哪些內(nèi)容是不應被搜索引擎的漫游器獲取的,哪些是可以被漫游器獲取的。因為一些系統(tǒng)中的URL是大小寫敏感的,所以robots.txt的文件名應統(tǒng)一為小寫。
robots.txt應放置于網(wǎng)站的根目錄下。
如果想單獨定義搜索引擎的漫游器訪問子目錄時的行為,那么可以將自定的設(shè)置合并到根目錄下的robots.txt,或者使用robots元數(shù)據(jù)(Metadata,又稱元數(shù)據(jù))。
robots.txt協(xié)議并不是一個規(guī)范,而只是約定俗成的,所以并不能保證網(wǎng)站的隱私。
注意robots.txt是用字符串比較來確定是否獲取URL,所以目錄末尾有與沒有斜杠“/”表示的是不同的URL。
robots.txt允許使用類似”Disallow: *.gif”這樣的通配符[1][2]。
解決方法:
這實際上只是一個”君子協(xié)議“,遵守與否,都在于爬蟲的編寫者。
通過User-Agent來控制訪問:
無論是瀏覽器還是爬蟲程序,在向服務器發(fā)起網(wǎng)絡請求的時候,都會發(fā)過去一個頭文件:headers 這里面的大多數(shù)的字段都是瀏覽器向服務器”表明身份“用的
對于爬蟲程序來說,最需要注意的字段就是:User-Agent
很多網(wǎng)站都會建立 user-agent白名單,只有屬于正常范圍的user-agent才能夠正常訪問。
解決方法:
在發(fā)送請求時使用該網(wǎng)站user-agent白名單的的UA
可以使用python的第三方模塊fake_useragent 隨機生成UA,需手動安裝
>>> from fake_useragent import FakeUserAgent >>> ua = FakeUserAgent() >>> ua.random 'Mozilla/5.0 (Windows NT 5.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/34.0.1866.237 Safari/537.36'
驗證碼:
最為經(jīng)典的反爬蟲策略當屬“驗證碼”了。因為驗證碼是圖片,用戶登錄時只需輸入一次便可登錄成功,而我們程序抓取數(shù)據(jù)過程中,需要不斷的登
錄,比如我們需要抓取1000個用戶的個人信息,則需要填1000次驗證碼,而手動輸入驗證碼是不現(xiàn)實的,所以驗證碼的出現(xiàn)曾經(jīng)難倒了很多網(wǎng)絡爬蟲工程師。
解決方法:
- 分析網(wǎng)站驗證碼機制,從網(wǎng)站后臺或者前端獲取驗證碼(文本形式),該方法只適用于少量網(wǎng)站,因為一般驗證碼我們很難拿到。
- 利用圖像識別技術(shù),識別驗證碼文本(例如最近比較火的深度學習Tensorflow等)。
- 往往一些網(wǎng)站不只有pc端,還有手機端網(wǎng)站,很有可能手機端是不包含驗證碼的。所以不妨試試手機端網(wǎng)站,也許會有意外收獲
IP限制:
另外一種麻煩的反爬蟲策略當屬封ip和封賬號了。本人初期曾經(jīng)用一臺機器抓取拉鉤,導致短時間內(nèi)賬號被封,IP被封,所以遇到類似問題一定要多加小心。
解決方法:
- 最簡單的解決辦法:限制程序抓取頻率,每隔幾秒登錄一次(如果對抓取數(shù)量沒有要求,則可以采用這種方法,如果想抓取大量數(shù)據(jù),還不得抓取到猴年馬月啊)。
- 既然封賬號封IP,那我就用多個賬號、多臺機器抓取唄,既解決了反爬蟲問題,也相當于做了分流處理,降低單臺機器帶寬壓力。
- 事實證明,有些網(wǎng)站即使我們采用了1)2)方法,還是會被封,這種情況下我們只能去抓取代理IP了,可以寫一個專門的爬蟲程序用來抓取代理,用這些代理去抓取我們想要的數(shù)據(jù)。到此為止,基本上封賬號、封IP的問題就可以解決了。
cookie:
通過cookie限制抓取信息,比如我們模擬登陸之后,想拿到登陸之后某頁面信息,千萬不要以為模擬登陸之后就所有頁面都可以抓了,有時候還需要請求一些中間頁面拿到特定cookie,然后才可以抓到我們需要的頁面。
解決方法:
通過瀏覽器的F12查看器,觀察具體整個過程都請求了哪些URL(主要包括HTML、JS、XHR),挨個試,試到成功為止。
JS渲染:
采用JS渲染頁面。什么意思呢,就是返回的頁面并不是直接請求得到,而是有一部分由JS操作DOM得到,所以那部分數(shù)據(jù)我們也拿不到咯。
解決方法:
- 可以使用Phantomjs模擬瀏覽器請求返回渲染完JS的頁面
- 通過抓包抓取JS渲染的數(shù)據(jù)(不推薦)
以上就是常見的反爬蟲urllib技術(shù)分享的詳細內(nèi)容,更多關(guān)于反爬蟲urllib技術(shù)的資料請關(guān)注腳本之家其它相關(guān)文章!

