天天看點

如何用python實作簡單的驗證碼識别功能

由于前些日子在做爬蟲,期間遇到了各種反爬技術,比如cookies驗證,驗證碼驗證等等。cookies驗證的話,沒有加密還好說,加過密的cookies實在是搞不了,以樓主的技術隻是勉強能知道對方是用什麼加密算法,解密就更不用提了。對于驗證碼驗證來說,網上确實有很多驗證碼識别的實作以及教程。樓主這裡主要串一下這一段過程,遇到的比較惡心的問題,以及解決辦法。那麼廢話不多說,進入正題。

樓主進行驗證試驗的網站正是樓主本市(曲阜市)自來水廠的網站,這個網站的驗證碼看上去比較簡單,對于剛剛接觸圖像識别,尤其是起初的驗證碼識别的人來說,算是完美的入門實驗網站了。它的驗證碼畫風都是這個樣紙滴~

如何用python實作簡單的驗證碼識别功能

嗯就是這樣人眼識别沒有任何難度的驗證碼,不像有些驗證碼人眼都看不出來,簡直是喪心病狂。

不過就算是這樣,在識别過程中也出了一些問題。我們先過一遍流程,再詳細說明這些問題。

實驗流程如下:

1、爬蟲循環爬取驗證碼二十張到三十張,并以檔案形式儲存在本地。

2、通過格式工廠,将圖檔洗成tif或tiff格式。(隻更改檔案擴充名無效,這是格式編碼的問題,必須用格式工廠去洗。)

3、通過jTessBoxEditor工具,生成圖像集。

4、在生成的圖像集路徑下,使用cmd指令

tesseract num.font.exp0.tif num.font.exp0 batch.nochop makebox
           

生成box檔案,這也就是後面python進行圖像識别的訓練庫。

5、在jTessBoxEditor下,打開圖像集,審查比對内容,并作人工修改。

主要流程如上,接下來對每一步進行詳述。

1、爬蟲爬取圖檔的實作比較簡單,我們使用python就可以輕松實作。

import requests
import random
url = 'http://www.qfzls.com/onlinepay/Login.aspx?om=yssf'  # 位址格式定義
imgurl = 'http://www.qfzls.com/onlinepay/yz.aspx'
filename = ''
for j in range(1, 9):
   m = str(random.randrange(0, 10))
   filename = filename + m
filename = 'D:\\image\\'+filename+'.bmp'  # 存成bmp格式
file = open(filename, 'ab')
r = requests.get(imgurl)
file.write(r.content)
file.close()
           

此處注意,此處一定要存成bmp格式。如果存成jpg格式,圖檔會變髒而難以識别。這也是起初樓主的識别率一直上不去的主要原因。

當然,樓主還對圖檔進行了一些處理,以提高識别率。代碼如下:

from PIL import Image
from PIL import ImageEnhance
image = Image.open(filename)  # filename為驗證碼的路徑加檔案名,若是放在項目裡可以直接使用檔案名調用
enh_bri = ImageEnhance.Brightness(image)  # 亮度增強
brightness = 1.5
image = enh_bri.enhance(brightness)

enh_col = ImageEnhance.Color(image)  # 色度增強
color = 1.5
image = enh_col.enhance(color)

enh_con = ImageEnhance.Contrast(image)  # 對比度增強
contrast = 1.5
image = enh_con.enhance(contrast)

enh_sha = ImageEnhance.Sharpness(image)  # 銳度增強
sharpness = 3.0
image = enh_sha.enhance(sharpness)

image.save(filename)
image.show()  #展示效果      

此處需要安裝一下pillow(PIL)包,使用pip工具即可。

最後,我們使用pytesseract來識别圖像。

import pytesseract
print(pytesseract.image_to_string(image))      

當然,這樣做的識别率通常不到百分之五十。圖像處理後不做訓練的話,識别率大概有百分之八十。經過訓練庫訓練後,識别率能達到九十五左右。最後,我考慮問題可能出在算法上,因為我發現圖像筆畫間隔有的地方隻有一個像素。于是我們把圖像像素擴充了一倍,識别率終于達到了百分之百。下面的操作都是如何利用Tesseract-OCR構造訓練庫。

2、因為使用jTessBoxEditor制作圖像集,隻支援tif或tiff格式,是以我們必須通過格式工廠洗一下圖檔格式。這一步就不多說了吧,基本操作。樓主使用的版本還是4.3.0稍微早點的版本,此處對軟體版本沒有要求。

洗完格式的圖檔放在一個單獨的檔案夾裡,友善進行後續操作。

第3、4、5步的話,可以詳細看一下大佬寫的部落格

Tesseract-OCR的簡單使用與訓練

連結位址:https://www.cnblogs.com/cnlian/p/5765871.html

這三步需要注意的問題在裡面都說得非常詳細。

最後的審查訓練庫内容需要人工去做,二三十張工作量不大,效果也很好。