我們都知道Python用來爬數據,為了不讓自家的數據被別人隨意的爬走,你知道怎麼反爬嗎?今天播妞帶著大家一起見識見識常見的反爬技術。
首先我們來看一下爬蟲程序和反爬蟲之間的一張邏輯圖:
以下說4種網站反爬蟲方式。
1.通過User-Agent來控制訪問
無論是瀏覽器還是爬蟲程序,在向伺服器發起網絡請求的時候,都會發過去一個頭文件:headers, 表明身份。
對於爬蟲程序來說,最需要注意的欄位就是:User-Agent
很多網站都會建立 user-agent白名單,只有屬於正常範圍的user-agent才能夠正常訪問。
解決方法:
可以自己設置一下user-agent,或者更好的是,可以從一系列的user-agent裡隨機挑出一個符合標準的使用。
2.通過JS腳本來防止爬蟲
舉個例子:如果想爬取某個網站,在請求之前,它會有一個驗證頁面來驗證你是否機器。
它是怎麼實現的呢:
他會通過js代碼生成一大段隨機的數字,然後要求瀏覽器通過js的運算得出這一串數字的和,再返回給伺服器。
解決方法:
使用PhantomJS
* PhantomJS是一個Python包,他可以在沒有圖形界面的情況下,完全模擬一個」瀏覽器「,js腳本驗證什麼的再也不是問題了。
3.通過IP限制來反爬蟲
如果一個固定的ip在短暫的時間內,快速大量的訪問一個網站,那自然會引起注意,管理員可以通過一些手段把這個ip給封了,爬蟲程序自然也就做不了什麼了。
解決方法:
比較成熟的方式是:IP代理池
簡單的說,就是通過IP代理,從不同的IP進行訪問,這樣就不會被封掉IP了。
可是IP代理的獲取本身就是一個很麻煩的事情,網上有免費和付費的,但是質量都層次不齊。如果是企業裡需要的話,可以通過自己購買集群雲服務來自建代理池。
def get_ip_poll():'''模擬代理池返回一個字典類型的鍵值對,'''ip_poll = ["http://xx.xxx.xxx.xxx:8000","http://xx.xxx.xxx.xxx:8111","http://xx.xxx.xxx.xxx:802","http://xx.xxx.xxx.xxx:9922","http://xx.xxx.xxx.xxx:801"]addresses = {}addresses['http'] = ip_poll[random.randint(0, len(ip_poll))]return addresses
4.通過robots.txt來限制爬蟲
世界上做爬蟲最大最好的就是Google了,搜尋引擎本身就是一個超級大的爬蟲,Google開發出來爬蟲24h不間斷的在網上爬取著新的信息,並返回給資料庫,但是這些搜尋引擎的爬蟲都遵守著一個協議:robots.txt
robots.txt(統一小寫)是一種存放於網站根目錄下的ASCII編碼的文本文件,它通常告訴網絡搜尋引擎的漫遊器(又稱網絡蜘蛛)。此網站中的哪些內容是不應被搜尋引擎的漫遊器獲取的,哪些是可以被漫遊器獲取的。因為一些系統中的URL是大小寫敏感的,所以robots.txt的文件名應統一為小寫。robots.txt應放置於網站的根目錄下。如果想單獨定義搜尋引擎的漫遊器訪問子目錄時的行為,那麼可以將自定的設置合併到根目錄下的robots.txt,或者使用robots元數據(Metadata,又稱元數據)。robots.txt協議並不是一個規範,而只是約定俗成的,所以並不能保證網站的隱私。注意robots.txt是用字符串比較來確定是否獲取URL,所以目錄末尾有與沒有斜槓「/」表示的是不同的URL。robots.txt允許使用類似"Disallow: *.gif"這樣的通配符[1][2]。
當然在特定情況下,比如說我們爬蟲的獲取網頁的速度,和人類瀏覽網頁是差不多的,這並不會給伺服器造成太大的性能損失,在這種情況下,我們是可以不用恪守 robots協議的。
以上4種反爬方式,你學會了嗎?