寫爬蟲有一個(gè)繞不過去的問題就是驗(yàn)證碼,現(xiàn)在驗(yàn)證碼分類大概有4種:
圖像類 滑動(dòng)類 點(diǎn)擊類 語音類今天先來看看圖像類,這類驗(yàn)證碼大多是數(shù)字、字母的組合,國內(nèi)也有使用漢字的。在這個(gè)基礎(chǔ)上增加噪點(diǎn)、干擾線、變形、重疊、不同字體顏色等方法來增加識(shí)別難度。
相應(yīng)的,驗(yàn)證碼識(shí)別大體可以分為下面幾個(gè)步驟:
灰度處理 增加對(duì)比度(可選) 二值化 降噪 傾斜校正分割字符 建立訓(xùn)練庫 識(shí)別由于是實(shí)驗(yàn)性質(zhì)的,文中用到的驗(yàn)證碼均為程序生成而不是批量下載真實(shí)的網(wǎng)站驗(yàn)證碼,這樣做的好處就是可以有大量的知道明確結(jié)果的數(shù)據(jù)集。
當(dāng)需要真實(shí)環(huán)境下需要獲取數(shù)據(jù)時(shí),可以使用結(jié)合各個(gè)大碼平臺(tái)來建立數(shù)據(jù)集進(jìn)行訓(xùn)練。
生成驗(yàn)證碼這里我使用Claptcha這個(gè)庫,當(dāng)然Captcha這個(gè)庫也是個(gè)不錯(cuò)的選擇。
為了生成最簡單的純數(shù)字、無干擾的驗(yàn)證碼,首先需要將claptcha.py的285行_drawLine做一些修改,我直接讓這個(gè)函數(shù)返回None,然后開始生成驗(yàn)證碼:
from claptcha import Claptchac = Claptcha("8069","/usr/share/fonts/truetype/freefont/FreeMono.ttf")t,_ = c.write('1.png')這里需要注意ubuntu的字體路徑,也可以在網(wǎng)上下載其他字體使用。生成驗(yàn)證碼如下:
可以看出,驗(yàn)證碼有形變。對(duì)于這類最簡單的驗(yàn)證碼,可以直接使用谷歌開源的tesserocr來識(shí)別。
首先安裝:
apt-get install tesseract-ocr libtesseract-dev libleptonica-devpip install tesserocr
然后開始識(shí)別:
from PIL import Imageimport tesserocrp1 = Image.open('1.png')tesserocr.image_to_text(p1)'8069/n/n'可以看出,對(duì)于這種簡單的驗(yàn)證碼,基本什么都不做識(shí)別率就已經(jīng)很高了。有興趣的小伙伴可以用更多的數(shù)據(jù)來測試,這里我就不展開了。
接下來,在驗(yàn)證碼背景添加噪點(diǎn)來看看:
c = Claptcha("8069","/usr/share/fonts/truetype/freefont/FreeMono.ttf",noise=0.4)t,_ = c.write('2.png')生成驗(yàn)證碼如下:
識(shí)別:
p2 = Image.open('2.png')tesserocr.image_to_text(p2)'8069/n/n'效果還可以。接下來生成一個(gè)字母數(shù)字組合的:
c2 = Claptcha("A4oO0zZ2","/usr/share/fonts/truetype/freefont/FreeMono.ttf")t,_ = c2.write('3.png')生成驗(yàn)證碼如下:
第3個(gè)為小寫字母o,第4個(gè)為大寫字母O,第5個(gè)為數(shù)字0,第6個(gè)為小寫字母z,第7個(gè)為大寫字母Z,最后一個(gè)是數(shù)字2。人眼已經(jīng)跪了有木有!但現(xiàn)在一般驗(yàn)證碼對(duì)大小寫是不做嚴(yán)格區(qū)分的,看自動(dòng)識(shí)別什么樣吧:
新聞熱點(diǎn)
疑難解答
圖片精選