整理 Python 爬蟲四種驗證碼的解決思路

2022-02-18 06:54:51 字數 2639 閱讀 6423

目錄這種驗證碼主要是通過使用者輸入中的字母、數字、漢字等進行驗證。如下圖

圖1 圖2

解決思路:這種是最簡單的一種,只要識別出裡面的內容,然後填入到輸入框中即可。

這種識別技術叫ocr,這裡我們推薦使用python的第三方庫,tesserocr。對於沒有什麼背影影響的驗證碼如圖2,直接通過這個庫來識別就可以。但是對於有嘈雜的背景的驗證碼這種,直接識別識別率會很低,遇到這種我們就得需要先處理一下,先對進行灰度化,然後再進行二值化,再去識別,這樣識別率會大大提高。

這種是將備選碎片直線滑動到正確的位置,如下圖

解決思路:對於這種驗證碼就比較複雜一點,但也是有相應的辦法。我們直接想到的就是模擬人去拖動驗證碼的行為,點選按鈕,然後看到了缺口的位置,最後把拼圖拖到缺口位置處完成驗證。

第一步:點選按鈕。然後我們發現,在你沒有點選按鈕的時候那個缺口和拼圖是沒有出現的,點選後才出現,這為我們找到缺口的位置提供了靈感。

第二步:拖到缺口位置。我們知道拼圖應該拖到缺口處,但是這個距離如果用數值來表示?通過我們第一步觀察到的現象,我們可以找到缺口的位置。這裡我們可以比較兩張圖的畫素,設定乙個基準值,如果某個位置的差值超過了基準值,那我們就找到了這兩張不一樣的位置,當然我們是從那塊拼圖的右側開始並且從左到右,找到第乙個不一樣的位置時就結束,這是的位置應該是缺口的left,所以我們使用selenium拖到這個位置即可。這裡還有個疑問就是如何能自動的儲存這兩張圖?這裡我們可以先找到這個標籤,然後獲取它的location和size,然後 top,bottom,left,right = location['y'] ,location['y']+size['height']+ location['x'] + size['width'] ,然後截圖,最後摳圖填入這四個位置就行。具體的使用可以檢視selenium文件,點選按鈕前摳張圖,點選後再摳張圖。最後拖動的時候要需要模擬人的行為,先加速然後減速。因為這種驗證碼有行為特徵檢測,人是不可能做到一直勻速的,否則它就判定為是機器在拖動,這樣就無法通過驗證了。

這兩種原理相似,只不過是乙個是給出文字,點選中的文字,乙個是給出,點出內容相同的。

這兩種沒有特別好的方法,只能借助第三方識別介面來識別出相同的內容,推薦乙個超級鷹,把驗證碼發過去,會返回相應的點選座標。

然後再使用selenium模擬點選即可。具體怎麼獲取和上面方法一樣。

這種就很棘手,每一次出現的都不一樣,但是也會出現一樣的。而且拖動順序都不一樣。

但是我們發現不一樣的驗證碼個數是有限的,這裡採用模版匹配的方法。我覺得就好像暴力列舉,把所有出現的驗證碼儲存下來,然後挑出不一樣的驗證碼,按照拖動順序命名,我們從左到右上下到下,設為1,2,3,4。上圖的滑動順序為4,3,2,1所以我們命名4_3_2_1.png,這裡得手動搞。當驗證碼出現的時候,用我們儲存的一一枚舉,與出現這種比較畫素,方法見上面。如果匹配上了,拖動順序就為4,3,2,1。然後使用selenium模擬即可。

這個只能識別簡單的驗證碼,也就是要求數字和字母必須規則,彎曲變形,遇到不規則的驗證碼,識別率並不是很高,不過可以自己去訓練模型。

這個需要花費一定的費用,但是識別率還是很高的,有很多打碼平台,識別乙個驗證碼的代價僅僅是0.01分錢,如果要爬取的**很多的時候,遇到驗證碼又是各不相同,最好的方式是去花費一些金錢來做這件事情。為什麼呢?因為隨便**乙個爬蟲工程師的工資都是15k左右吧,按照一天的工資計算800元計算。識別乙個驗證碼按照一分錢計算。程式設計師一天的工資可以識別8萬個驗證碼,所以人工打碼是最好的選擇。乙個企業的能否生存下去,並不是因為技術的好才存活下去的。而是需要各種環境,機遇。一些大的公司也會借用小的公司的技術,比如支付寶人臉識別是自己開發的嗎?所以,合理的借力也是成功的必要條件。

使用機器學習去識別驗證碼,識別率比人的都高,缺點是需要大量的訓練資料,這些資料小手工標記。開發周期長,耗時。

為何這個在最後說呢?因為我覺得這個更重要,我在爬蟲的時候遇到各種需要登入**,也有驗證碼。就會手工的吧cookie資訊複製下來,加到請求頭上就可以了。如此簡單的技術,我們為何不用呢??

這個在網上還是可以找到,別人已經訓練好了。

在**上或者一些驗證碼識別群,有一些人專門從事驗證碼的識別工作,收費費用合理,大概100--1000元錢,普通的驗證碼也就兩三百塊錢。也可以去找他們學習這項技術,並且也不難

adsl動態ip伺服器,並不是什麼高大上的方式,也不是什麼特別高階的伺服器,相反,使用起來,我們一般是用配置非常低的那一類,因為這個時候重要的是數量而不是質量。

原理很簡單,在家庭網路中寬頻上網只要斷開再撥號一次,鏈結成功就會更換一次外網ip。並且鏈結建立後網速比較穩定。這就是動態ip了,一般這個ip池很大,乙個城市一般會有5w-30w的ip。基本屬於用不完。so,只要有一台接入了寬頻的電腦,都可以叫做adsl動態ip伺服器。但是,你要明白這樣以來時間將會有部分消耗在網路建立的時間上大約十秒。

例如某專案,頁面每兩次訪問就會被強制跳轉到驗證碼頁面,so,為了跳過驗證碼就得每兩次訪問就換一次ip。而且,最嚴重的就是要是面對這樣高限制ip的,那麼就不能在一台機器上通過多開爬蟲客戶端從而實現單機器的分布式爬蟲。效率低很多。要想提高效率要麼是ip限制次數比較高的。比如1000/ip這種;要麼就是多機器每機器單個爬蟲的分布式了。

爬蟲之驗證碼破解(四)

註冊超級鷹賬戶超級鷹官網 官網有詳細使用說明,以下是api使用方法。from hashlib import md5 class chaojiying client object def init self,username,password,soft id self.username usernam...

爬蟲 驗證碼處理

關的門戶 在進行登入的時候,如果使用者連續登入的次數超過3次或者5次的時候,就會在登入頁中動態生成驗證碼。通過驗證碼達到分流和反爬的效果。雲打碼平台處理驗證碼的實現流程 3.可以將驗證碼提交給三方平台進行識別,返回驗證碼上的資料值 雲打碼平台 1.在官網中進行註冊 普通使用者和開發者使用者 2.登入...

python爬蟲之OCR驗證碼識別

ocr驗證碼初探 隨機獲取驗證碼儲存到專案的根目錄下 今天第寫乙個簡單的驗證碼識別例子小夥伴說識別出來的跟預想的不一樣,主要是我寫的例子驗證的比較簡單,而小夥伴識別的內有多餘的線條干擾了的識別。對於這種情況我們需要對進行一下處理,例如轉灰度 二值化等操作。我這裡就可以識別出來了,但是有的識別出來的還...