由于前些日子在做爬蟲,期間遇到了各種反爬技術,比如cookies驗證,驗證碼驗證等等。cookies驗證的話,沒有加密還好說,加過密的cookies實在是搞不了,以樓主的技術隻是勉強能知道對方是用什麼加密算法,解密就更不用提了。對于驗證碼驗證來說,網上确實有很多驗證碼識别的實作以及教程。樓主這裡主要串一下這一段過程,遇到的比較惡心的問題,以及解決辦法。那麼廢話不多說,進入正題。
樓主進行驗證試驗的網站正是樓主本市(曲阜市)自來水廠的網站,這個網站的驗證碼看上去比較簡單,對于剛剛接觸圖像識别,尤其是起初的驗證碼識别的人來說,算是完美的入門實驗網站了。它的驗證碼畫風都是這個樣紙滴~
嗯就是這樣人眼識别沒有任何難度的驗證碼,不像有些驗證碼人眼都看不出來,簡直是喪心病狂。
不過就算是這樣,在識别過程中也出了一些問題。我們先過一遍流程,再詳細說明這些問題。
實驗流程如下:
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
這三步需要注意的問題在裡面都說得非常詳細。
最後的審查訓練庫内容需要人工去做,二三十張工作量不大,效果也很好。