前言
經常大家在做自動化測試或者做網絡爬蟲的時候,都很容易遇到驗證碼。
今天,我們就簡單的說下,怎么用python來處理驗證碼。
(注意:我所有的python相關的文章用的都是python3。)
準備工作
1、tesseract-ocr軟件
Tesseract的OCR引擎最先由HP實驗室于1985年開始研發,至1995年時已經成為OCR業內最準確的三款識別引擎之一。然而,HP不久便決定放棄OCR業務,Tesseract也從此塵封。
數年以后,HP意識到,與其將Tesseract束之高閣,不如貢獻給開源軟件業,讓其重煥新生--2005年,Tesseract由美國內華達州信息技術研究所獲得,并求諸于Google對Tesseract進行改進、消除Bug、優化工作。
總之,tesseract-ocr是一個做圖形識別必須用到第一個軟件,不僅可以處理驗證碼,也可以識別圖片上的文字等等。
我已經把軟件上傳了我的網盤,大家可以直接下載,不需要安裝,解壓即可。
下載地址:
鏈接:https://pan.baidu.com/s/1bpMz3OV 密碼:108a
2、Pytesseract包
Pytesseract是一個python的第三方的包,主要作用就是用來連接操作tesseract-ocr工具。
為我們用python來處理圖形打好了基礎。
可以使用pip工具直接安裝。
3、Pillow包
python的圖形處理庫,用來處理調整圖形的各種內容。
Pillow由PIL而來,所以該導入該庫使用import PIL。
Pillow中最重要的類就是Image,該類存在于同名的模塊中??梢酝ㄟ^以下幾種方式實例化:從文件中讀取圖片,處理其他圖片得到,或者直接創建一個圖片。
可以使用pip工具直接安裝。
配置環境
第一步、把Tesseract-OCR添加到環境變量。
我們下載好Tesseract-OCR后,直接將其解壓,然后把所在路徑添加到環境變量中。
如圖所示:
復制路徑:D:\Program Files\Tesseract-OCR
添加到環境變量PATH中
第二步、安裝Pytesseract和Pilllow包
打開cmd,使用pip工具依次安裝Pytesseract和Pilllow包
如圖所示:
第三步、檢查是否安裝成功
1、檢查tesseract-ocr
打開cmd,輸入tesseract
2、檢查Pytesseract和Pillow包
在python里導入試試吧,沒有報錯,那就說明成功了。
OK!沒問題,說明我們已經安裝成功了,那我們就開始寫代碼了。
識別驗證碼
要識別驗證碼,那我們首先就要獲取驗證碼。
我一般有兩種常用的方式去獲取驗證碼。
第一種是通過接口保存驗證碼。
第二種是通過截圖保存驗證碼。
我們依次說明。
1、通過接口保存驗證碼并識別。
通過接口去獲取的話,我們是需要借助requests這個包的。
這里我們主要講識別驗證碼,requests我會在其他文章里詳細的說明。
import requests
import pytesseract
from PIL import Image
'''
調用接口請求驗證碼,保存到本地,識別驗證,檢查識別的驗證碼對不對。
'''
# 獲取圖片的接口地址
url = hurl + "/file/getCaptcha1"
# headers需要的參數
headers = None
# 接口需要的參數
querystring = {"w": "70", "h": "29"}
# 發送請求
response = requests.request("GET", url, headers=headers, params=querystring, verify=False)
# 接口返回的數據以二進制的方式展示
img = response.content
# 選擇保存的路徑和圖片格式
with open('F:\MyPython\TestCode\data\code.jpg', 'wb') as f:
# 保存
f.write(img)
# 用Image模塊打開上一步保存的驗證碼
image = Image.open('F:\MyPython\TestCode\data\code.jpg')
# 識別驗證碼
optCode = pytesseract.image_to_string(image)
# 打印出驗證碼
print("驗證碼:", optCode)
2、通過截圖保存驗證碼并識別。
要截圖的話肯定需要界面,那么我們就需要借助selenium去操作了。
selenium這里也不講,大家應該都會吧。
import pytesseract
from PIL import Image
from selenium import webdriver
'''
調用接口請求驗證碼,保存到本地,識別驗證,檢查識別的驗證碼對不對。
'''
driver = webdriver.Chrome()
打開有驗證碼的界面
driver.get("https://www.XXXX.com/login")
# 比較好理解、截圖并保存到這個路徑
driver.get_screenshot_as_file('F:/VScode/LoarRunner/Vcode/homepage.png')
# 打開剛剛保存的圖片
im = Image.open('F:/VScode/LoarRunner/Vcode/homepage.png')
# 設置要裁剪的區域(驗證碼所在的區域)
box = (1214, 82, 1285, 111)
# 截圖,生成只有驗證碼的圖片
region = im.crop(box)
# 保存到本地路徑
region.save("F:/VScode/LoarRunner/Vcode/image_code.jpg")
# 讀取驗證碼圖片
image = Image.open("F:/VScode/LoarRunner/Vcode/image_code.jpg")
# 開始識別驗證碼
optCode = pytesseract.image_to_string(image)
# 打印出驗證碼
print(optCode)
總結
簡單的來說,識別圖片,驗證碼,文字啊,都可以這樣子操作。
但是驗證碼的處理遠遠沒有這么簡單。
畢竟啊,現在的驗證碼是越來越變態。
希望大家可以靈活應用圖形處理方法。
可以嘗試下識別照片上的文字什么的。