天天看點

Python處理驗證碼:基于PIL和Tesseract的數字計算識别處理思路

Python處理驗證碼:基于PIL和Tesseract的數字計算識别處理思路

如圖,我們在使用python自動化的時候經常會遇到很多各式各樣的驗證碼。這個是一個數字加法的驗證碼。

幹擾項裡包含完整的數字、字母資訊,普通的OCR識别可能不是很準确。

但是不管怎麼樣,咱們先把必要的環境搭建起來,試一下Tesseract的識别結果吧。

1、安裝Tesseract:

首先需要下載下傳Tesseract的安裝包 官方網址:

https://digi.bib.uni-mannheim.de/tesseract/,網上的教程很多推薦安裝名稱裡不帶dev的正式版,據說更穩定

配置Tesseract:

安裝完畢之後需要配置一下環境變量,分為兩步:

1、在path裡加入安裝路徑,及安裝路徑内的tessdata檔案夾路徑。

Python處理驗證碼:基于PIL和Tesseract的數字計算識别處理思路

2、建立系統變量{TESSDATA_PREFIX:E:\Program Files (x86)\Tesseract-OCR\tessdata} 這裡變量名是固定的TESSDATA_PREFIX,值是剛剛提到的安裝路徑内下一級tessdata檔案夾的完整路徑

Python處理驗證碼:基于PIL和Tesseract的數字計算識别處理思路
Python處理驗證碼:基于PIL和Tesseract的數字計算識别處理思路

然後指令行裡 安裝pytesseract:

完成以上步驟之後,請重新啟動電腦。

圖檔無法處理識别:

直接調用ocr識别出結果的話,隻需要3行代碼:

但是對于這個驗證碼的效果不是非常好,比如:

Python處理驗證碼:基于PIL和Tesseract的數字計算識别處理思路
Python處理驗證碼:基于PIL和Tesseract的數字計算識别處理思路
Python處理驗證碼:基于PIL和Tesseract的數字計算識别處理思路

要麼是沒有結果,要麼就是一堆亂七八糟的東西。

這樣肯定是用不了的

那麼隻能先處理一下圖檔了

圖檔處理識别:

我下載下傳了20張這個網站的二維碼,發現了以下規律:

1、驗證碼内容一定包含“ = 2位數字+2位數字”的

2、驗證碼内容的顔色是随機的。

3、驗證碼内容的位置應該是固定的(20張圖檔的加号都在同一位置)

4、驗證碼圖檔的幹擾内容包含字母、數字、符号

5、驗證碼圖檔的幹擾内容顔色沒有跟主要内容一模一樣,但是每張圖的幹擾項一定包含主要内容顔色相近的部分。

Python處理驗證碼:基于PIL和Tesseract的數字計算識别處理思路

可以看到,根據字型的不同,顯示的時候,主幹是棕色的,但是構成這個字的邊緣顔色是稍微淡一些的。不過20張圖裡都沒有發現有幹擾項的顔色跟主要内容顔色一模一樣。

是以我的想法是因為存在主幹的近似色,是以主要的濾波手段可能導緻把圖檔變得更難處理的可能性,是以不如直接擷取主幹顔色,其他像素不是主幹顔色的全部以白色替代,删除幹擾項之後再進行識别。

主幹顔色可以使用固定的加号的正中間那一點的坐标擷取。(80,23)(80,24)

Python處理驗證碼:基于PIL和Tesseract的數字計算識别處理思路

Python代碼如下:

Python處理驗證碼:基于PIL和Tesseract的數字計算識别處理思路

檔案如下:

Python處理驗證碼:基于PIL和Tesseract的數字計算識别處理思路

結語:

準确率我大概看了一下,應該是100%的。以上算是成功破解了對方網站的驗證碼。

驗證碼的識别整體思路應該就是這樣子了,當然我舉得例子是比較簡單的驗證碼。還有各種麻煩的驗證碼,未來可能需要用到截取、卷積、濾波、清洗等等方法,需要根據實際的情況靈活地使用,但是整體的思路就是:

找到驗證碼規律,根據規律清洗幹擾噪點,然後識别。希望可以啟發到大家。

最後的最後,現在已經可以擷取驗證碼的字元串了,計算結果非常簡單我就不做了。有興趣的可以試試,我會把所有圖檔、源代碼打包,大家可以下載下傳試一下。

Tesseract安裝的時候,系統變量哪裡2步都不能少,少一個程式執行就會報錯,切記