Python爬蟲系列之解析驗證碼

2021-09-26 05:20:39 字數 2634 閱讀 9279

本節目標

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

準備工作

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

獲取驗證碼

為了便於實驗,我們先將驗證碼的儲存到本地,以供測試。

開啟開發者工具,找到驗證碼元素,可以看到這是一張,它的 src 屬性是 checkcode.aspx,在這裡我們直接將這個鏈結開啟: ,就可以看到乙個驗證碼,直接右鍵儲存下來即可,將名稱命名為 code.jpg,如圖所示:

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

在這裡我們首先新建了乙個 image 物件,然後呼叫了 tesserocr 的 image_to_text() 方法,傳入該 image 物件即可完成識別,實現過程非常簡單,識別結果如下:

jr42

import tesserocr

print

(tesserocr.file_to_text(

'image.png'

))

不過經測試此種方法的識別效果不如上一種方法好。

驗證碼處理

如上的識別基本沒有難度,只是新建乙個 image 物件,然後呼叫 image_to_text() 方法即可得出的識別結果。

接下來我們換乙個驗證碼試一下,命名為 code2.jpg,如圖 8-3 所示:

圖 8-3 驗證碼

重新用下面的**測試一下:

這時可以看到如下輸出結果:

ffkt

發現這次識別和實際的結果有所偏差,這是因為驗證碼內的多餘線條干擾了的識別。

對於這種情況,我們還需要做一下額外的處理,如轉灰度、二值化等操作。

image = image.convert(

'l')

image.show(

)

image = image.convert(

'1')

image.show(

)

另外我們還可以指定二值化的閾值,上面的方法採用的是預設閾值127,不過我們不能用原圖直接轉化,可以先轉為灰度影象,然後再指定二值化閾值轉化,**如下:

image = image.convert(

'l')

threshold =

80table =

for i in

range

(256):

if i < threshold:0)

else:1

) image = image.point(table,

'1')

image.show(

)

在這裡我們指定了乙個變數 threshold 代表二值化閾值,閾值設定為 80,處理之後我們看一下結果,如圖 8-4 所示:

圖 8-4 處理結果

經過處理之後我們發現原來的驗證碼中的線條已經被去除了,而且整個驗證碼變得黑白分明,這時重新識別驗證碼,**如下:

即可發現執行結果變成了:

pfrt

識別正確。

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

Python爬蟲之Xpath解析

例項化乙個etree物件,且需要將被解析的頁面的原始碼資料載入到該物件中 呼叫etree物件中的xpath方法結合著xpath表示式實現標籤的定位和內容的捕獲 pip install lxmlfrom lxml import etree1 將本地的html檔案中的原始碼載入到etree物件中 etr...

python 網路爬蟲 之scrapy系列

網路爬蟲之scrapy系列 scrapy 網路爬蟲 之0 爬蟲與反扒 scrapy網路爬蟲 之一 scrapy框架簡介和基礎應用 scrapy網路爬蟲 之二 持久化操作 scrapy網路爬蟲 之三 遞迴解析和post請求 scrapy網路爬蟲 之四 日誌等級和請求傳參 scrapy網路爬蟲 之五 c...

Python網路爬蟲之解析庫

xpath,全稱xml path language,即xml路徑語言,它是一門在xml文件中查詢資訊的語言,但是它同樣適用於html文件的搜尋 xpath常用規則 表示式 描述 nodename 選取此節點的所有子節點 從當前節點擊取直接子節點 從當前節點擊取子孫節點 選取當前節點 選取當前節點的父...