【Python】Python3網絡爬蟲實戰-42、圖形驗證碼的識別

本節我們首先來嘗試識別最簡單的一種驗證碼,圖形驗證碼,這種驗證碼出現的最早,現在也很常見,一般是四位字母或者數字組成的,例如中國知網的註冊頁面就有類似的驗證碼,鏈接爲:http://my.cnki.net/elibregister/commonRegister.aspx,頁面如圖 8-1 所示:

圖 8-1 知網註冊頁面

表單的最後一項就是圖形驗證碼,我們必須完全輸入正確圖中的字符纔可以完成註冊。

1. 本節目標

本節我們就以知網的驗證碼爲例,講解一下利用 OCR 技術識別此種圖形驗證碼的方法。

2. 準備工作

識別圖形驗證碼需要的庫有 Tesserocr,如果沒有安裝可以參考第一章的安裝說明。

3. 獲取驗證碼

爲了便於實驗,我們先將驗證碼的圖片保存到本地,以供測試。

打開開發者工具,找到驗證碼元素,可以看到這是一張圖片,它的 src 屬性是 CheckCode.aspx,在這裏我們直接將這個鏈接打開:http://my.cnki.net/elibregister/CheckCode.aspx,就可以看到一個驗證碼,直接右鍵保存下來即可,將名稱命名爲 code.jpg,學習過程中有不懂的可以加入我們的學習交流秋秋圈784中間758後面214,與你分享Python企業當下人才需求及怎麼從零基礎學習Python,和學習什麼內容。相關學習視頻資料、開發工具都有分享如圖 8-2 所示:

圖 8-2 驗證碼

這樣我們就可以得到一張驗證碼圖片供下面測試識別使用了。

4. 識別測試

接下來我們新建一個項目,將驗證碼圖片放到項目根目錄下,用 Tesserocr 庫來識別一下該驗證碼試試,代碼如下:


import tesserocr

from PIL import Image

image  =  Image.open('code.jpg')

result  =  tesserocr.image_to_text(image)

print(result)
Python資源分享qun 784758214 ,內有安裝包,PDF,學習視頻,這裏是Python學習者的聚集地,零基礎,進階,都歡迎

在這裏我們首先新建了一個 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 所示:

圖 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 所示:

圖 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
Python資源分享qun 784758214 ,內有安裝包,PDF,學習視頻,這裏是Python學習者的聚集地,零基礎,進階,都歡迎

識別正確。

可見對於一些有干擾的圖片,我們做一些灰度和二值化處理,會提高其識別正確率。

6. 結語

本節我們瞭解了利用 Tesserocr 識別驗證碼的過程,對於簡單的圖形驗證碼我們可以直接用它來得到結果,如果要提高識別的準確度還可以對驗證碼圖片做一下預處理。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章