Python圖形驗(yàn)證碼識(shí)別教程詳解
前言
(結(jié)尾有彩蛋歐)
目前,許多網(wǎng)站采取各種各樣的措施來反爬蟲,其中一個(gè)措施便是使用驗(yàn)證碼。隨著技術(shù)的發(fā)展,驗(yàn)證碼的花樣越來越多。驗(yàn)證碼最初是幾個(gè)數(shù)字組合的簡單的圖形驗(yàn)證碼,后來加入了英文字母和混淆曲線。有的網(wǎng)站還可能看到中文字符的驗(yàn)證碼,這使得識(shí)別愈發(fā)困難。
后來 12306 驗(yàn)證碼的出現(xiàn)使得行為驗(yàn)證碼開始發(fā)展起來,用過 12306 的用戶肯定多少為它的驗(yàn)證碼頭疼過。我們需要識(shí)別文字,點(diǎn)擊與文字描述相符的圖片,驗(yàn)證碼完全正確,驗(yàn)證才能通過。現(xiàn)在這種交互式驗(yàn)證碼越來越多,如極驗(yàn)滑動(dòng)驗(yàn)證碼需要滑動(dòng)拼合滑塊才可以完成驗(yàn)證,點(diǎn)觸驗(yàn)證碼需要完全點(diǎn)擊正確結(jié)果才可以完成驗(yàn)證,另外還有滑動(dòng)宮格驗(yàn)證碼、計(jì)算題驗(yàn)證碼等。
驗(yàn)證碼變得越來越復(fù)雜,爬蟲的工作也變得愈發(fā)艱難。有時(shí)候我們必須通過驗(yàn)證碼的驗(yàn)證才可以訪問頁面。本章就專門針對(duì)驗(yàn)證碼的識(shí)別做統(tǒng)一講解。
接下來會(huì)涉及的驗(yàn)證碼有普通圖形驗(yàn)證碼、極驗(yàn)滑動(dòng)驗(yàn)證碼、點(diǎn)觸驗(yàn)證碼、微博宮格驗(yàn)證碼,這些驗(yàn)證碼識(shí)別的方式和思路各有不同。了解這幾個(gè)驗(yàn)證碼的識(shí)別方式之后,我們可以舉一反三,用類似的方法識(shí)別其他類型驗(yàn)證碼。
環(huán)境使用
- python 3.9
- pycharm
圖形驗(yàn)證碼的識(shí)別
我們首先識(shí)別最簡單的一種驗(yàn)證碼,即圖形驗(yàn)證碼。這種驗(yàn)證碼最早出現(xiàn),現(xiàn)在也很常見,一般由 4 位字母或者數(shù)字組成。例如,某某網(wǎng)站的注冊(cè)頁面有類似的驗(yàn)證碼。
一般來說,表單的最后一項(xiàng)就是圖形驗(yàn)證碼,我們必須完全正確輸入圖中的字符才可以完成注冊(cè)和登錄。
1. 本節(jié)目標(biāo)
以某網(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)證碼元素。驗(yàn)證碼元素是一張圖片,它的 src 屬性是 CheckCode.aspx??梢钥吹揭粋€(gè)驗(yàn)證碼,右鍵保存即可,將其命名為 yzm.jpg。
這樣我們就可以得到一張驗(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('yzm.jpg') result = tesserocr.image_to_text(image) print(result)
在這里我們新建了一個(gè) Image 對(duì)象,調(diào)用了 tesserocr 的 image_to_text() 方法。傳入該 Image 對(duì)象即可完成識(shí)別,實(shí)現(xiàn)過程非常簡單,結(jié)果如下所示:JR42。是不是很神奇。
5. 驗(yàn)證碼處理
接下來我們換一個(gè)驗(yàn)證碼,將其命名為 code2.jpg
重新運(yùn)行上面的代碼,輸出FFKT。
這次識(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 = image.convert('1') image.show()
我們還可以指定二值化的閾值。上面的方法采用的是默認(rèn)閾值 127。不過我們不能直接轉(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()
運(yùn)行之后就會(huì)得到我們想要的處理結(jié)果。而且我們發(fā)現(xiàn)原來驗(yàn)證碼中的線條已經(jīng)去除,整個(gè)驗(yàn)證碼變得黑白分明。這時(shí)重新識(shí)別驗(yàn)證碼,再次運(yùn)行上面的代碼就可以得到我們要的驗(yàn)證碼。
那么,針對(duì)一些有干擾的圖片,我們做一些灰度和二值化處理,這會(huì)提高圖片識(shí)別的正確率。
tesserocr庫安裝
在這里我和大家簡單介紹一下,這個(gè)庫的安裝教程。
1. tesseract軟件的安裝
在win10下,安裝tesseract可以進(jìn)入該網(wǎng)址進(jìn)行下載 https://digi.bib.uni-mannheim.de/tesseract/
其中,文件名中帶有dev的為開發(fā)版本,不帶dev的為穩(wěn)定版本,可以選擇下載不帶dev的版本。例如可以選擇下載tesseract-ocr-win64-setup-v5.3.0.20221214.exe。
下載完成后,打開下載文件,其中可以勾選Additional language data(download)選項(xiàng)來安裝OCR識(shí)別支持的語言包,以便OCR識(shí)別多國語言。(也可以在選項(xiàng)中只勾選chinese)
2. 環(huán)境配置
在系統(tǒng)變量里,修改path,添加你安裝tesserocr的路徑。在系統(tǒng)變量里,創(chuàng)建一個(gè)新的變量名為:TESSDATA_PREFIX,值為:D:\Program Files(X86)\Tesseract-OCR\tessdata(根據(jù)自己安裝的tesserocr安裝路徑為準(zhǔn))。
3. 安裝tesseracr包
- 嘗試pip安裝:
pip install tesserocr
- 如果不成功,則嘗試通過.whl文件安裝。
下載地址:https://github.com/simonflueckiger/tesserocr-windows_build/releases 這里就不介紹whl怎么安裝的了,不會(huì)的私信評(píng)論。
TIP
tesserocr也只是識(shí)別手段的一種,如果需要高精度的識(shí)別,可以嘗試TensorFlow實(shí)現(xiàn)深度學(xué)習(xí)模型,通過訓(xùn)練模型來識(shí)別圖形驗(yàn)證碼。
以上就是Python圖形驗(yàn)證碼識(shí)別教程詳解的詳細(xì)內(nèi)容,更多關(guān)于Python圖形驗(yàn)證碼的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
- Python編寫一個(gè)驗(yàn)證碼圖片數(shù)據(jù)標(biāo)注GUI程序附源碼
- Python中識(shí)別圖片/滑塊驗(yàn)證碼準(zhǔn)確率極高的ddddocr庫詳解
- Python通用驗(yàn)證碼識(shí)別OCR庫ddddocr的安裝使用教程
- Python通用驗(yàn)證碼識(shí)別OCR庫之ddddocr驗(yàn)證碼識(shí)別
- Python免費(fèi)驗(yàn)證碼識(shí)別之ddddocr識(shí)別OCR自動(dòng)庫實(shí)現(xiàn)
- python調(diào)用文字識(shí)別OCR輕松搞定驗(yàn)證碼
- python網(wǎng)絡(luò)爬蟲之模擬登錄 自動(dòng)獲取cookie值 驗(yàn)證碼識(shí)別的具體實(shí)現(xiàn)
- Python常用驗(yàn)證碼標(biāo)注和識(shí)別(需求分析和實(shí)現(xiàn)思路)
相關(guān)文章
解決同一目錄下python import報(bào)錯(cuò)問題
這篇文章主要介紹了解決同一目錄下python import報(bào)錯(cuò)問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-12-12解決Ubuntu18中的pycharm不能調(diào)用tensorflow-gpu的問題
這篇文章主要介紹了解決Ubuntu18中的pycharm不能調(diào)用tensorflow-gpu的問題,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-09-09Python利用Matplotlib庫實(shí)現(xiàn)繪制餅形圖
這篇文章主要為大家分享了基于python+matplotlib庫的餅形圖繪制,具體內(nèi)容涉及一般的餅圖、分裂餅圖、以及環(huán)形圖,感興趣的小伙伴可以了解一下2022-04-04Python下singleton模式的實(shí)現(xiàn)方法
這篇文章主要介紹了Python下singleton模式的實(shí)現(xiàn)方法,有一定的借鑒價(jià)值,需要的朋友可以參考下2014-07-07Python OpenCV對(duì)本地視頻文件進(jìn)行分幀保存的實(shí)例
今天小編就為大家分享一篇Python OpenCV對(duì)本地視頻文件進(jìn)行分幀保存的實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2019-01-01關(guān)于python pygame游戲進(jìn)行聲音添加的技巧
這篇文章主要給大家分享的是pygame游戲進(jìn)行聲音添加的方法,這文中介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們一定要看完!2021-10-10Python 等分切分?jǐn)?shù)據(jù)及規(guī)則命名的實(shí)例代碼
這篇文章主要介紹了Python 等分切分?jǐn)?shù)據(jù)及規(guī)則命名的實(shí)例代碼,代碼簡單易懂,非常不錯(cuò),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2019-08-08Python可變與不可變數(shù)據(jù)和深拷貝與淺拷貝
這篇文章主要介紹了Python可變與不可變數(shù)據(jù)和深拷貝與淺拷貝,拷貝函數(shù)是專門為可變數(shù)據(jù)類型list、set、dict使用的一種函數(shù),更多相關(guān)內(nèi)容,需要的小伙伴可以參考一下2022-04-04Python實(shí)現(xiàn)標(biāo)記數(shù)組的連通域
這篇文章主要為大家詳細(xì)介紹了如何通過Python實(shí)現(xiàn)標(biāo)記數(shù)組的連通域,文中的示例代碼講解詳細(xì),對(duì)我們學(xué)習(xí)Python有一定的幫助,需要的可以參考一下2023-04-04