【摘要】 爬蟲過程中難免會碰到驗證碼,各種各樣的驗證碼似乎阻擋了爬蟲的腳步。
由於本文實現的功能是在內網環境完成,因此,沒有**介紹,也沒有識別效果展示。
爬蟲過程中難免會碰到驗證碼,各種各樣的驗證碼似乎阻擋了爬蟲的腳步。
為了識別機器和真實使用者而誕生的爬蟲
碰到驗證碼有兩個方法解決:
打碼平台
為了識別驗證碼花錢,顯然不符合「極客精神」,既然我們已經會寫python,為啥不自己寫乙個方法來識別呢?
我在寫乙個自動搶會議室的系統,但是搶會議室的過程中,需要輸入驗證碼才可以完成預定。
這個驗證碼比較簡單,只有4位阿拉伯數字組成。形式大概和下面比較類似,但的噪音比下面要嚴重得多。由於驗證碼都在公司辦公環境,所以無法匯出來。
一開始,我寫了一些影象預處理的方法,流程大概有以下幾步:
讀取,並調整影象尺寸
對進行灰度處理
手動設定閾值,對灰度影象進行二值化處理
遍歷整張影象,掃瞄影象黑色畫素連線區域,將範圍太小的黑色畫素塊去除
對影象橫縱座標進行掃瞄,取出完整的影象
到第5步,我得到的影象畫素是6*10,縮小影象尺寸,可以更好地保留結果資訊,減少由於旋轉,拉伸等形態變換帶來的影象差異,畫素不大,但已經足夠區分不同的數字了。
由於驗證碼資料樣本實在太少,在一開始的嘗試的傳統機器學習與深度學習方法都毫無例外失敗了。
我嘗試了以下方法:
實際上使用mnist資料集來訓練,是不合理的。因為即使是阿拉伯數字,我遇到的驗證碼裡的樣式和mnist中的樣式還是存在不小的差異,這會導致識別率一直無法提公升。
mnist資料集
後來我想到了乙個方法,影象裡的資訊既然只有阿拉伯數字,總共只有10類,而且每張中都是固定的4個數字。
那我能不能用簡單的方法進行比對?建立乙個樣本影象庫,對測試進行預處理以後,得到分割4張6*10的二值化,與樣本影象庫進行影象上的比對,最後進行結果進行統計,歸類,得到最終**值。
預處理後得到的(來自:字元型驗證碼識別完整過程及python實現)
影象預處理的方法前面已經完成了,關鍵是用什麼方法來進行影象比對呢?
一開始我想的很簡單,直接對每張樣本i1與測試i2相同座標的畫素進行逐一比對,計算i1與i2的相同座標的畫素相等的數目,最後求均值,得到10個分值,分數高的就是**結果。
這個計算方法看起來可行,但是在實際使用的時候有一些問題
後來我找到了乙個方法,先對樣本影象進行編碼轉換。得到乙個能體現影象特徵的code,再將這些樣本影象的code全部儲存起來。這樣下次要使用的時候,就不必每次都讀一遍啦!
得到hash值後,將同一數字對於的hash值存在乙個txt檔案中,實際使用的時候,對**影象進行上文相同的預處理操作,分割出4個後,再計算出4個**影象的hash值,將測試影象的hash值與txt檔案中的hash進行比對,計算漢明距離,即兩個64位的hash值有多少位是不一樣的,不相同位數越少,越相似。
得到測試影象與每個樣本影象hash值的漢明距離後,進行統計,平均,取**值最大的樣本影象標籤為**值。識別的速度也還不錯,平均只需要0.3秒就可以完成一次識別。
這種識別的方法簡單易操作,對簡單的字母數字組合驗證碼非常有效,但是對影象預處理提出了更高的要求,而且不具備泛化性,碰到不同的驗證碼每次都需要單獨編輯規則。
華為雲618大促火熱進行中,全場1折起,免費抽主機,消費滿額送p30 pro,點此搶購。
本文發表在李思原部落格「機器在學習」
用Python識別簡單驗證碼
簡單介紹下 1.pil python imaging library 是 python 中最常用的影象處理庫 2.tesseract oc是hp的乙個文字識別專案,後來交給google做了開源 3.pytesseract是基於tesseract oc的python封裝。pytesseract的使用十...
Python 驗證碼識別
使用pip安裝pytessseract,如圖所示 例項 識別該中的字元 指令碼 import os os.chdir c python34 lib site packages pytesser from pytesser import from pytesseract import image to...
python 驗證碼識別
一 python識別簡單驗證碼 1 2 func 實現簡單驗證碼獲取 3 4import pytesseract 5from pil import image67 首先通過image開啟乙個 9 然後通過方法將image物件轉化為字串10 code pytesseract.image to stri...