數說爬蟲和反爬蟲大戰,誰是最後贏家?
GIF
前言
爬蟲與發爬蟲的廝殺,一方為了拿到數據,一方為了防止爬蟲拿到數據,誰是最後的贏家?對於一張網頁,我們往往希望它是結構良好,內容清晰的,這樣搜索引擎才能準確地認知它。而反過來,又有一些情景,我們不希望內容能被輕易獲取,比方說電商網站的交易額,教育網站的題目等。因為這些內容,往往是一個產品的生命線,必須做到有效地保護。這就是爬蟲與反爬蟲這一話題的由來。
本文授權轉載自有數La(文:小籃子 )
文章編輯:小雨
爬蟲與發爬蟲的廝殺,一方為了拿到數據,一方為了防止爬蟲拿到數據,誰是最後的贏家?對於一張網頁,我們往往希望它是結構良好,內容清晰的,這樣搜索引擎才能準確地認知它。而反過來,又有一些情景,我們不希望內容能被輕易獲取,比方說電商網站的交易額,教育網站的題目等。因為這些內容,往往是一個產品的生命線,必須做到有效地保護。這就是爬蟲與反爬蟲這一話題的由來。
偽裝者:User-Agent
在使用爬蟲的時候,python默認的user-agent頭是形如Python-urllib/2.1的,導致在訪問某些網站的時候,被拒絕訪問,解決的辦法就是給自己的爬蟲偽裝一個user-agent頭。
常用的user-agent頭有
而IE各個版本典型的userAgent如下:
Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.0; Trident/4.0)
IE8 on Windows 7
Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1; Trident/4.0)
64-bit IE on 64-bit Windows 7:
Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1; Win64; x64; Trident/4.0)
32-bit IE on 64-bit Windows 7:
Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1; WOW64; Trident/4.0)
Firefox幾個版本的userAgent大致如下:
Mozilla/5.0 (Windows; U; Windows NT 5.2) Gecko/2008070208 Firefox/3.0.1
Mozilla/5.0 (Windows; U; Windows NT 5.1) Gecko/20070309 Firefox/2.0.0.3
Mozilla/5.0 (Windows; U; Windows NT 5.1) Gecko/20070803 Firefox/1.5.0.12
其中,版本號是Firefox之後的數字。
推薦準備若干個瀏覽器的user agent白名單,然後每次發送請求的時候就從這幾個user agents中隨機選一個填上去,就可以成功偽裝瀏覽器了。如下:
IP大作戰
如果一個固定的ip在短暫的時間內,快速大量的訪問一個網站,那自然會引起注意,管理員可以通過一些手段把這個ip給封了,爬蟲程序自然也就做不了什麼了。
1. 最簡單的解決辦法是:降低爬蟲採集速率,每隔幾秒登錄一次,使速率略低於閾值。
Requests,Urllib2都可以使用time庫的sleep()函數:
如果抓取的數量較少,可以採用這種方法,但對於大量數據,還不得抓取到猴年馬月啊,因此,我們還得另謀生路。
2.建立IP代理池
既然封IP,那就用多個賬號抓取唄,因此使用代理是必備的,網上有很多免費的開源代理池可供使用。每次請求都在代理池中隨機獲取一個代理,這樣就不會達到閾值了。缺點是網上收集代理有的效率很低,隨時都可能無法使用。使用request加代理:
3.使用IP雲代理服務
服務商的代理穩定,高質量,不過需要收取一定的費用。常見的IP提供商有:阿布雲,芝麻代理,快代理,站大爺代理等。可將資源下載進行修改即可。
有些伺服器可能不是對IP進行限制,而是對賬戶進行限制,即使使用IP代理每次請求都是同一賬戶,如果對賬戶進行限制,可以申請大量賬戶,建立cookie池,每次請求都隨機獲取一個cookie,保證低於閾值。除了cookie池,還有User-Agent池,根據具體情況建立,使用方法與IP代理池相似。
眾里尋他千百度:ajax載入
對於ajax載入的數據,我們通過request或post方法請求得到的網頁都無法得到。例如:我們想獲取京東上商品的價格、銷量、好評等方面的數據,但是請求返回的網頁中沒有這些數據。對於ajax載入的頁面,一般有兩種方法。
1. 分析網頁
按F12打開瀏覽器調試工具,在Network下選擇XHR或Doc標籤,分析(雙擊點開查看)這兩個標籤下的鏈接。如果點開鏈接打開的網頁中正好有那些沒有載入的數據,則這些數據是通過該鏈接傳送的。再對該鏈接進行規律分析,以後對該鏈接發送請求。
2. 使用PhantomJS模擬瀏覽器行為
使用PhantomJS模擬瀏覽器進行發送請求,得到返回的內容是完全的(ajax載入的數據也會有)。但是使用PhantomJS請求速度過慢,一般一個網頁4~5s時間,不能忍。一般要使用PhantomJS需要開多線程。
大家來找茬:驗證碼
最為經典的反爬蟲策略當屬「驗證碼」了。因為驗證碼是圖片,用戶登錄時只需輸入一次便可登錄成功,而我們程序抓取數據過程中,需要不斷的登錄,比如我們需要抓取1000個用戶的個人信息,則需要填1000次驗證碼,而手動輸入驗證碼是不現實的,所以驗證碼的出現曾經難倒了很多網路爬蟲工程師。常見的驗證碼有四種
1.
輸入式驗證碼
這種驗證碼主要是通過用戶輸入圖片中的字母、數字、漢字等進行驗證。如下圖:
解決思路:這種是最簡單的一種,只要識別出裡面的內容,然後填入到輸入框中即可。這種識別技術叫OCR,這裡我們推薦使用Python的第三方庫-tesserocr。對於沒有什麼背影影響的驗證碼,直接通過這個庫來識別就可以。但是對於有嘈雜的背景的驗證碼這種,直接識別識別率會很低,遇到這種我們就得需要先處理一下圖片,先對圖片進行灰度化,然後再進行二值化,再去識別,這樣識別率會大大提高。步驟如下:
1. 使用tesserocr
在本地存儲一張驗證碼的圖片做測試
image = Image.open("test.jpg")
result = tesserocr.image_to_text(image)
print(result)
直接將文本轉為字元串
import tesserocr
print(tesserocr.file_to_text("test.jpg"))
2. 處理驗證碼圖片
convert()方法,可將圖片轉化為灰度圖像、二值化圖像
2
滑動式驗證碼
這種是將備選碎片直線滑動到正確的位置,如下圖。滑動驗證碼特點是防模擬,防偽造,防暴力。
解決思路:對於這種驗證碼就比較複雜一點,但也是有相應的辦法。我們直接想到的就是模擬人去拖動驗證碼的行為,瀏覽器模擬驗證法。點擊按鈕,然後看到了缺口的位置,最後把拼圖拖到缺口位置處完成驗證。
1. 初始化
2. 模擬點擊
3. 識別缺口
首先對比原圖和現圖,利用selenium選取圖片元素,得到位置和size,然後獲取截圖
4. 模擬拖動:
3
點擊式驗證碼
點擊式的驗證包含兩種
圖文驗證:通過文字提醒用戶點擊圖中相同字的位置進行驗證。
圖標選擇: 給出一組圖片,按要求點擊其中一張或者多張。借用萬物識別的難度阻擋機器。
這兩種沒有特別好的方法,可藉助第三方識別介面來識別出相同的內容,推薦一個超級鷹,把驗證碼發過去,會返回相應的點擊坐標。
然後再使用selenium模擬點擊即可。具體怎麼獲取圖片和上面方法一樣。
使用超級鷹平台識別,修改Python API:
4
宮格驗證碼
這種就很棘手,每一次出現的都不一樣,但是也會出現一樣的。而且拖動順序都不一樣。但是我們發現不一樣的驗證碼個數是有限的,這裡採用模版匹配的方法。我覺得就好像暴力枚舉,把所有出現的驗證碼保存下來,然後挑出不一樣的驗證碼,按照拖動順序命名,我們從左到右上下到下,設為1,2,3,4。上圖的滑動順序為4,3,2,1所以我們命名4_3_2_1.png,這裡得手動搞。當驗證碼出現的時候,用我們保存的圖片一一枚舉,與出現這種比較像素,方法見上面。如果匹配上了,拖動順序就4,3,2,1。然後使用selenium模擬即可。
? end ?
【燈塔大數據】微信公眾號介紹:中國電信北京研究院通過整合電信自有數據、互聯網數據和線下數據,創建了業內領先的「燈塔」大數據行業應用平台,致力於與行業合作夥伴共同打造大數據行業應用生態圈。
微信公眾號【燈塔大數據】關鍵字信息:
【區塊鏈】下載《2018中國區塊鏈行業分析報告》
【物聯網】下載《物聯網+:製造業向智能服務轉型的新引擎》全文
【投資分析】獲取美國人工智慧投資報告完整版全文
【普華永道】下載《普華永道:區塊鏈讓城市更智能》全文
【思維導圖】下載12種工具的獲取方式
【半月刊】下載大數據瞭望半月刊
【 燈塔 】 查看更多關鍵字回復
TAG:燈塔大數據 |