對於用戶來說,當然希望自己的爬蟲能夠爬取到自己想要的資源,但是對於服務來說,有時候卻並不希望自己服務器上的資源那麼輕易的被爬蟲獲取到。因此就出現了反爬蟲,圖形驗證碼就是這樣一種機制。
各種驗證碼可以說是判斷操作者是人還是機器的一個重要手段,而光學文字識別(Optical Character Recognition,OCR)可以或多或少解決這個問題。
Tesseract
Tesseract 是一個 OCR 庫,通過訓練該庫可以識別任何字體。
安裝
該項目的 github 地址爲:https://github.com/tesseract-ocr/tesseract
設置環境變量
安裝完成之後,爲了在全局都能夠使用 tesseract,需要設置環境變量,與平常不同,該軟件除了需要將 tesseract 所在的目錄添加到環境變量中,還需要另外設置一個名爲 TESSDATA_PREFIX 的環境變量,該環境變量的值爲 .traineddata 訓練數據集的所在目錄。
在 cmd 中使用 tesseract
環境變量設置完成之後,就可以在終端中使用 tesseract 進行操作了,使用方法爲:
tesseract imgpath txtpath
上邊的命名會啓動 tesseract,識別 imgpath 指向的圖片,並將識別後的結果保存到 txtpath 中,一般情況下可以不用指定 txtpath 的文件名,系統會自動添加文件擴展名。
pytesseract
基本使用
import pytesseract
from PIL import Image
# tesseract 路徑
pytesseract.pytesseract.tesseract_cmd = r'D:\Tesseract\Tesseract-OCR\tesseract.exe'
image = Image.open('000.jpg')
# 將識別的圖片轉換爲 string
text = pytesseract.image_to_string(image)
print(text)
識別圖形驗證碼
使用 tesseract 識別網站圖形驗證碼的邏輯也很簡單:
- 使用 urllib 或 requests 發送請求
- 將 response 中的圖形驗證碼解析出來,並保存到本地
- 在本地利用 pytesseract 庫識別圖形驗證碼
但是由於 tesseract 並不能夠保證百分百識別正確,因此也不能保證 pytesseract 識別的結果是正確的。
同時在本地識別出的圖形驗證碼,就算識別正確,由於時效等原因,也不能將識別結果輸入到對應的文本框中,因此在爬蟲應用中感覺也用的不多。
通常遇到圖形驗證碼的情況,還是會選擇利用 selenium+chromedriver 模擬瀏覽器行爲,通過鍵盤輸入以保證結果的準確性。