1. 程式人生 > >python爬蟲學習(2)用tesserocr識別影象驗證碼

python爬蟲學習(2)用tesserocr識別影象驗證碼

在學習爬蟲的過程中難免會遇到驗證碼問題,作為純自動化的爬蟲是不可能手動去輸入驗證碼的。

那麼我們就要學會怎麼去識別它。

而驗證碼也分很多種類,主要的幾種:

(1)影象驗證碼:這是最簡單的一種,也很常見。就比如CSDN登入幾次失敗之後就會出驗證碼。

(2)滑塊驗證碼:需要按住滑塊並移到正確的位置。比如bilibili的登入驗證。(這個我也寫過識別程式碼,原始碼託管github:https://github.com/OSinoooO/bilibili_geetest。可以去看一看呀QAQ)

(3)點觸驗證碼:需要識別圖片中的文字或型別並按序點選。比如12306的登入驗證。

(4)宮格驗證碼

:類似安卓的宮格解鎖。比如新浪微博的宮格驗證碼。

                               

準備工作

我們這次要識別的影象驗證碼,需要用到tesserocr庫,但是安裝tesserocr庫之前,需要先安裝好相應版本的tesseract。因為tesserocr是基於tesseract來封裝的庫。

安裝tesseract

檔案帶dev的是開發版本,不帶dev的是穩定版本。

選擇需要的版本後開始下載,然後安裝配置比較簡單,就不多說了。語言包的作用就是可以識別多國語言,可在安裝選項裡選擇,也可以自行下載。(下載後的語言包需要解壓後放到Tesseract-OCR

/tessdata目錄下)

安裝好之後開啟cmd,輸入tesseract,如果出現以下資訊就說明安裝成功。

安裝tesserocr

tesseract安裝好以後就可以安裝tesserocr了。

github上有較為詳盡的安裝說明,大多數情況下我們可以在cmd下通過pip來安裝:(前提是安裝了pip,一般python都自帶)

pip install tesserocr

但是由於windows下tesserocr 2.3.0版本目前還沒有,所以pip安裝在Windows下面會報錯。

解決方法之一是通過wheel安裝:

2.通過如下命令安裝:(需要與下載檔案在同一目錄下)

pip install 檔名.whl

        至少我遇到的錯誤是解決了 - -

程式碼構建

完成上述準備工作之後,就可以開始寫程式碼了。

程式碼邏輯是很簡單的,為了便於理解和以後的呼叫,我把它封裝成了一些方法:

初始化

from PIL import Image
import tesserocr, requests

# 圖片下載連結
image_url = 'https://passport.csdn.net/ajax/verifyhandler.ashx'
# 圖片儲存路徑
image_path = 'image/captcha.jpg'

首先匯入必要的包,然後初始化連線(可修改)和路徑(可修改)。

圖片下載和獲取

def image_download():
    """
    圖片下載
    """
    response = requests.get(image_url)
    with open(image_path, 'wb') as f:
        f.write(response.content)
def get_image():
    """
    用Image獲取圖片檔案
    :return: 圖片檔案
    """
    image = Image.open(image_path)
    return image

影象處理

def image_grayscale_deal(image):
    """
    圖片轉灰度處理
    :param image:圖片檔案
    :return: 轉灰度處理後的圖片檔案
    """
    image = image.convert('L')
    #取消註釋後可以看到處理後的圖片效果
    #image.show()
    return image

def image_thresholding_method(image):
    """
    圖片二值化處理
    :param image:轉灰度處理後的圖片檔案
    :return: 二值化處理後的圖片檔案
    """
    # 閾值,控制二值化程度,自行調整(不能超過256)
    threshold = 160
    table = []
    for i in range(256):
        if i < threshold:
            table.append(0)
        else:
            table.append(1)
    # 圖片二值化,此處第二個引數為數字一
    image = image.point(table, '1')
    # 取消註釋後可以看到處理後的圖片效果 
    #image.show()
    return image

經過轉灰度和二值化處理之後的圖片更加容易識別,可以通過 show() 方法來顯示處理後的圖片。

處理前:

轉灰度處理後:

二值化處理後:

影象識別

def captcha_tesserocr_crack(image):
    """
    影象識別
    :param image: 二值化處理後的圖片檔案
    :return: 識別結果
    """
    result = tesserocr.image_to_text(image)
    return result

呼叫tesserocr的image_to_text()方法識別:

然後通過呼叫上述方法,就可以實現自動識別驗證碼了。

PS:不是每次識別都能成功,要想提高成功率,需要下載訓練好的語言包。(下載網速巨慢!!!)

        還有就是用深度學習的方法去訓練機器~

from PIL import Image
import tesserocr, requests

# 圖片下載連結
image_url = 'http://my.cnki.net/elibregister/CheckCode.aspx'
# 圖片儲存路徑
image_path = 'image/captcha.jpg'

def image_download():
    """
    圖片下載
    """
    response = requests.get(image_url)
    with open(image_path, 'wb') as f:
        f.write(response.content)

def get_image():
    """
    用Image獲取圖片檔案
    :return: 圖片檔案
    """
    image = Image.open(image_path)
    return image

def image_grayscale_deal(image):
    """
    圖片轉灰度處理
    :param image:圖片檔案
    :return: 轉灰度處理後的圖片檔案
    """
    image = image.convert('L')
    #取消註釋後可以看到處理後的圖片效果
    #image.show()
    return image

def image_thresholding_method(image):
    """
    圖片二值化處理
    :param image:轉灰度處理後的圖片檔案
    :return: 二值化處理後的圖片檔案
    """
    # 閾值
    threshold = 160
    table = []
    for i in range(256):
        if i < threshold:
            table.append(0)
        else:
            table.append(1)
    # 圖片二值化,此處第二個引數為數字一
    image = image.point(table, '1')
    #取消註釋後可以看到處理後的圖片效果
    #image.show()
    return image


def captcha_tesserocr_crack(image):
    """
    影象識別
    :param image: 二值化處理後的圖片檔案
    :return: 識別結果
    """
    result = tesserocr.image_to_text(image)
    return result


if __name__ == '__main__':
    image_download()
    image = get_image()
    img1 = image_grayscale_deal(image)
    img2 = image_thresholding_method(img1)
    print(captcha_tesserocr_crack(img2))