Python3爬蟲中識(shí)別圖形驗(yàn)證碼的實(shí)例講解
本節(jié)我們首先來嘗試識(shí)別最簡單的一種驗(yàn)證碼,圖形驗(yàn)證碼,這種驗(yàn)證碼出現(xiàn)的最早,現(xiàn)在也很常見,一般是四位字母或者數(shù)字組成的,例如中國知網(wǎng)的注冊(cè)頁面就有類似的驗(yàn)證碼,鏈接為:http://my.cnki.net/elibregister/commonRegister.aspx,頁面:
表單的最后一項(xiàng)就是圖形驗(yàn)證碼,我們必須完全輸入正確圖中的字符才可以完成注冊(cè)。
1.本節(jié)目標(biāo)
本節(jié)我們就以知網(wǎng)的驗(yàn)證碼為例,講解一下利用 OCR 技術(shù)識(shí)別此種圖形驗(yàn)證碼的方法。
2. 準(zhǔn)備工作
識(shí)別圖形驗(yàn)證碼需要的庫有 Tesserocr,如果沒有安裝可以參考第一章的安裝說明。
3. 獲取驗(yàn)證碼
為了便于實(shí)驗(yàn),我們先將驗(yàn)證碼的圖片保存到本地,以供測試。
打開開發(fā)者工具,找到驗(yàn)證碼元素,可以看到這是一張圖片,它的 src 屬性是 CheckCode.aspx,在這里我們直接將這個(gè)鏈接打開:http://my.cnki.net/elibregister/CheckCode.aspx,就可以看到一個(gè)驗(yàn)證碼,直接右鍵保存下來即可,將名稱命名為 code.jpg,如圖 8-2 所示:
這樣我們就可以得到一張驗(yàn)證碼圖片供下面測試識(shí)別使用了。
4. 識(shí)別測試
接下來我們新建一個(gè)項(xiàng)目,將驗(yàn)證碼圖片放到項(xiàng)目根目錄下,用 Tesserocr 庫來識(shí)別一下該驗(yàn)證碼試試,代碼如下:
import tesserocr from PIL import Image image = Image.open('code.jpg') result = tesserocr.image_to_text(image) print(result)
在這里我們首先新建了一個(gè) Image 對(duì)象,然后調(diào)用了 Tesserocr 的 image_to_text() 方法,傳入該 Image 對(duì)象即可完成識(shí)別,實(shí)現(xiàn)過程非常簡單,識(shí)別結(jié)果如下:
JR42
另外 Tesserocr 還有一個(gè)更加簡單的方法直接將圖片文件轉(zhuǎn)為字符串可以達(dá)到同樣的效果,代碼如下:
import tesserocr print(tesserocr.file_to_text('image.png'))
不過經(jīng)測試此種方法的識(shí)別效果不如上一種方法好。
5. 驗(yàn)證碼處理
如上的圖片識(shí)別基本沒有難度,只是新建一個(gè) Image 對(duì)象,然后調(diào)用 image_to_text() 方法即可得出圖片的識(shí)別結(jié)果。
接下來我們換一個(gè)驗(yàn)證碼試一下,命名為 code2.jpg,如圖 8-3 所示:
重新用下面的代碼測試一下:
import tesserocr from PIL import Image image = Image.open('code2.jpg') result = tesserocr.image_to_text(image) print(result)
這時(shí)可以看到如下輸出結(jié)果:
FFKT
發(fā)現(xiàn)這次識(shí)別和實(shí)際的結(jié)果有所偏差,這是因?yàn)轵?yàn)證碼內(nèi)的多余線條干擾了圖片的識(shí)別。
對(duì)于這種情況,我們還需要做一下額外的處理,如轉(zhuǎn)灰度、二值化等操作。
我們可以利用 Image 對(duì)象的 convert() 方法參數(shù)傳入 L 即可將圖片轉(zhuǎn)化為灰度圖像,代碼如下:
image = image.convert('L') image.show()
傳入 1 即可將圖片進(jìn)行二值化處理:
image = image.convert('1') image.show()
另外我們還可以指定二值化的閾值,上面的方法采用的是默認(rèn)閾值127,不過我們不能用原圖直接轉(zhuǎn)化,可以先轉(zhuǎn)為灰度圖像,然后再指定二值化閾值轉(zhuǎn)化,代碼如下:
image = image.convert('L') threshold = 80 table = [] for i in range(256): if i < threshold: table.append(0) else: table.append(1) image = image.point(table, '1') image.show()
在這里我們指定了一個(gè)變量 threshold 代表二值化閾值,閾值設(shè)置為 80,處理之后我們看一下結(jié)果,如圖 8-4 所示:
經(jīng)過處理之后我們發(fā)現(xiàn)原來的驗(yàn)證碼中的線條已經(jīng)被去除了,而且整個(gè)驗(yàn)證碼變得黑白分明,這時(shí)重新識(shí)別驗(yàn)證碼,代碼如下:
import tesserocr from PIL import Image image = Image.open('code2.jpg') image = image.convert('L') threshold = 127 table = [] for i in range(256): if i < threshold: table.append(0) else: table.append(1) image = image.point(table, '1') result = tesserocr.image_to_text(image) print(result)
即可發(fā)現(xiàn)運(yùn)行結(jié)果變成了:
PFRT
識(shí)別正確。
可見對(duì)于一些有干擾的圖片,我們做一些灰度和二值化處理,會(huì)提高其識(shí)別正確率。
6. 本節(jié)代碼
本節(jié)代碼地址為:https://github.com/Python3WebSpider/CrackImageCode。
7. 結(jié)語
本節(jié)我們了解了利用 Tesserocr 識(shí)別驗(yàn)證碼的過程,對(duì)于簡單的圖形驗(yàn)證碼我們可以直接用它來得到結(jié)果,如果要提高識(shí)別的準(zhǔn)確度還可以對(duì)驗(yàn)證碼圖片做一下預(yù)處理。
以上就是Python3爬蟲中識(shí)別圖形驗(yàn)證碼的實(shí)例講解的詳細(xì)內(nèi)容,更多關(guān)于Python3爬蟲識(shí)別圖形驗(yàn)證碼的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
tensorflow 2.0模式下訓(xùn)練的模型轉(zhuǎn)成 tf1.x 版本的pb模型實(shí)例
這篇文章主要介紹了tensorflow 2.0模式下訓(xùn)練的模型轉(zhuǎn)成 tf1.x 版本的pb模型實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨想過來看看吧2020-06-06Python 格式化打印json數(shù)據(jù)方法(展開狀態(tài))
今天小編就為大家分享一篇Python 格式化打印json數(shù)據(jù)方法(展開狀態(tài)),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2020-02-02python統(tǒng)計(jì)多維數(shù)組的行數(shù)和列數(shù)實(shí)例
今天小編就為大家分享一篇python統(tǒng)計(jì)多維數(shù)組的行數(shù)和列數(shù)實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2018-06-06解決多個(gè)@Scheduled定時(shí)任務(wù)執(zhí)行時(shí)個(gè)別不執(zhí)行問題
這篇文章主要介紹了解決多個(gè)@Scheduled定時(shí)任務(wù)執(zhí)行時(shí)個(gè)別不執(zhí)行問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-08-08Python如何實(shí)現(xiàn)Paramiko的二次封裝
這篇文章主要介紹了Python如何實(shí)現(xiàn)Paramiko的二次封裝,幫助大家更好的理解和使用python,感興趣的朋友可以了解下2021-01-01python調(diào)用subprocess模塊實(shí)現(xiàn)命令行操作控制SVN的方法
這篇文章主要介紹了使用python的subprocess模塊實(shí)現(xiàn)對(duì)SVN的相關(guān)操作,通過設(shè)置GitSvn類,在該類下自定義執(zhí)行SVN常規(guī)操作的方法,需要的朋友跟隨小編一起看看吧2022-09-09