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
安裝好之後開啟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))