今天要聊的就是在爬蟲遇到驗證碼,如何去解決。
1.前言:關於驗證碼,我覺得是很low逼的技術,但是很多面試官都會問到如何解決驗證碼,好像是能識別驗證的就代表了爬蟲工程師的技術很牛逼,相反,爬蟲工程師就是菜鳥。我覺得以此來評價爬蟲工程師的水平高低,是非常不合理的。
2. 網站為何要用驗證碼?
網站擔心別人暴力破解刷票、論壇灌水、刷頁,防止爬蟲爬取數據,防止別人利用短信驗證碼做短信炸彈等原因。
有效防止某個黑客對某一個特定注冊用戶用特定程序暴力破解方式進行不斷的登錄嘗試,實際上使用驗證碼是現在很多網站通行的方式(比如招商銀行的網上個人銀行,百度社區),我們利用比較簡易的方式實現了這個功能。雖然登錄麻煩一點,但是對網友的密碼安全來說這個功能還是很有必要,也很重要。但我們還是 提醒大家要保護好自己的密碼 ,盡量使用混雜了數字、字母、符號在內的6位以上密碼,不要使用諸如1234之類的簡單密碼或者與用戶名相同、類似的密碼 ,免得你的賬號被人盜用給自己帶來不必要的麻煩。
3.識別驗證碼的技術有哪些?
3.1 Tesseract-OCR
這個只能識別簡單的驗證碼,也就是要求數字和字母必須規則,彎曲變形,遇到不規則的驗證碼,識別率並不是很高,不過可以自己去訓練模型。
3.2 人工打碼
這個需要花費一定的費用,但是識別率還是很高的,有很多打碼平台,識別一個驗證碼的代價僅僅是0.01分錢,如果要爬取的網站很多的時候,遇到驗證碼又是各不相同,最好的方式是去花費一些金錢來做這件事情。為什么呢?因為隨便照片一個爬蟲工程師的工資都是15k左右吧,按照一天的工資計算800元計算。識別一個驗證碼按照一分錢計算。程序員一天的工資可以識別8萬個驗證碼,所以人工打碼是最好的選擇。一個企業的能否生存下去,並不是因為技術的好才存活下去的。而是需要各種環境,機遇。一些大的公司也會借用小的公司的技術,比如支付寶人臉識別是自己開發的嗎?所以,合理的借力也是成功的必要條件。
3.3 機器學習
使用機器學習去識別驗證碼,識別率比人的都高,缺點是需要大量的訓練數據,這些數據小手工標記。開發周期長,耗時。
3.4 繞過驗證碼
為何這個在最后說呢?因為我覺得這個更重要,我在爬蟲的時候遇到各種需要登錄網址,也有驗證碼。就會手工的吧cookie信息復制下來,加到請求頭上就可以了。如此簡單的技術,我們為何不用呢??
3.5 萬能識別庫
這個在網上還是可以找到,別人已經訓練好了。
3.6 軟件定制
在淘寶上或者一些驗證碼識別群,有一些人專門從事驗證碼的識別工作,收費費用合理,大概100--1000元錢,普通的驗證碼也就兩三百塊錢。也可以去找他們學習這項技術,並且也不難
3.7 ADSL動態IP服務器原理
ADSL動態IP服務器,並不是什么高大上的方式,也不是什么特別高端的服務器,相反,使用起來,我們一般是用配置非常低的那一類,因為這個時候重要的是數量而不是質量。
原理很簡單,在家庭網絡中寬帶上網只要斷開再撥號一次,鏈接成功就會更換一次外網ip。並且鏈接建立后網速比較穩定。這就是動態ip了,一般這個ip池很大,一個城市一般會有5W-30W的ip。基本屬於用不完。so,只要有一台接入了寬帶的電腦,都可以叫做ADSL動態IP服務器。但是,你要明白這樣以來時間將會有部分消耗在網絡建立的時間上大約十秒。
例如我們現在要攻克的R項目。他的頁面每兩次訪問就會被強制跳轉到驗證碼頁面,,so,為了跳過驗證碼就得每兩次訪問就換一次ip。而且,最嚴重的就是要是面對這樣高限制ip的,那么就不能在一台機器上通過多開爬蟲客戶端從而實現單機器的分布式爬蟲。效率低很多。要想提高效率要么是ip限制次數比較高的。比如1000/ip這種,。要么就是多機器每機器單個爬蟲的分布式了
結束語:
不管是黑貓還是白貓,逮着老鼠都是好貓。識別驗證的方式千千萬萬,總會有一個適合自己的。