您好,登錄后才能下訂單哦!
這篇文章主要講解了Python3爬蟲中如何實現識別圖形驗證碼,內容清晰明了,對此有興趣的小伙伴可以學習一下,相信大家閱讀完之后會有幫助。
表單的最后一項就是圖形驗證碼,我們必須完全輸入正確圖中的字符才可以完成注冊。
1.本節目標
本節我們就以知網的驗證碼為例,講解一下利用 OCR 技術識別此種圖形驗證碼的方法。
2. 準備工作
識別圖形驗證碼需要的庫有 Tesserocr,如果沒有安裝可以參考第一章的安裝說明。
3. 獲取驗證碼
為了便于實驗,我們先將驗證碼的圖片保存到本地,以供測試。
打開開發者工具,找到驗證碼元素,可以看到這是一張圖片,它的 src 屬性是 CheckCode.aspx,在這里我們直接將這個鏈接打開:http://my.cnki.net/elibregister/CheckCode.aspx,就可以看到一個驗證碼,直接右鍵保存下來即可,將名稱命名為 code.jpg,如圖 8-2 所示:
這樣我們就可以得到一張驗證碼圖片供下面測試識別使用了。
4. 識別測試
接下來我們新建一個項目,將驗證碼圖片放到項目根目錄下,用 Tesserocr 庫來識別一下該驗證碼試試,代碼如下:
import tesserocr from PIL import Image image = Image.open('code.jpg') result = tesserocr.image_to_text(image) print(result)
在這里我們首先新建了一個 Image 對象,然后調用了 Tesserocr 的 image_to_text() 方法,傳入該 Image 對象即可完成識別,實現過程非常簡單,識別結果如下:
JR42
另外 Tesserocr 還有一個更加簡單的方法直接將圖片文件轉為字符串可以達到同樣的效果,代碼如下:
import tesserocr print(tesserocr.file_to_text('image.png'))
不過經測試此種方法的識別效果不如上一種方法好。
5. 驗證碼處理
如上的圖片識別基本沒有難度,只是新建一個 Image 對象,然后調用 image_to_text() 方法即可得出圖片的識別結果。
接下來我們換一個驗證碼試一下,命名為 code2.jpg,如圖 8-3 所示:
重新用下面的代碼測試一下:
import tesserocr from PIL import Image image = Image.open('code2.jpg') result = tesserocr.image_to_text(image) print(result)
這時可以看到如下輸出結果:
FFKT
發現這次識別和實際的結果有所偏差,這是因為驗證碼內的多余線條干擾了圖片的識別。
對于這種情況,我們還需要做一下額外的處理,如轉灰度、二值化等操作。
我們可以利用 Image 對象的 convert() 方法參數傳入 L 即可將圖片轉化為灰度圖像,代碼如下:
image = image.convert('L') image.show()
傳入 1 即可將圖片進行二值化處理:
image = image.convert('1') image.show()
另外我們還可以指定二值化的閾值,上面的方法采用的是默認閾值127,不過我們不能用原圖直接轉化,可以先轉為灰度圖像,然后再指定二值化閾值轉化,代碼如下:
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()
在這里我們指定了一個變量 threshold 代表二值化閾值,閾值設置為 80,處理之后我們看一下結果,如圖 8-4 所示:
經過處理之后我們發現原來的驗證碼中的線條已經被去除了,而且整個驗證碼變得黑白分明,這時重新識別驗證碼,代碼如下:
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)
即可發現運行結果變成了:
PFRT
識別正確。
可見對于一些有干擾的圖片,我們做一些灰度和二值化處理,會提高其識別正確率。
看完上述內容,是不是對Python3爬蟲中如何實現識別圖形驗證碼有進一步的了解,如果還想學習更多內容,歡迎關注億速云行業資訊頻道。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。