經常大家在做自動化測試或者做網絡爬蟲的時候,都很容易遇到驗證碼。
今天,我們就簡單的說下,怎麼用python來處理驗證碼。
(注意:我所有的python相關的文章用的都是python3。)
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
Pytesseract是一個python的第三方的包,主要作用就是用來連接操作tesseract-ocr工具。
為我們用python來處理圖形打好了基礎。
可以使用pip工具直接安裝。
python的圖形處理庫,用來處理調整圖形的各種內容。
Pillow由PIL而來,所以該導入該庫使用import PIL。
Pillow中最重要的類就是Image,該類存在於同名的模塊中。可以通過以下幾種方式實例化:從文件中讀取圖片,處理其他圖片得到,或者直接創建一個圖片。
可以使用pip工具直接安裝。
我們下載好Tesseract-OCR後,直接將其解壓,然後把所在路徑添加到環境變量中。
如圖所示:
複製路徑:D:\Program Files\Tesseract-OCR
添加到環境變量PATH中
打開cmd,使用pip工具依次安裝Pytesseract和Pilllow包
如圖所示:
1、檢查tesseract-ocr
打開cmd,輸入tesseract
2、檢查Pytesseract和Pillow包
在python裡導入試試吧,沒有報錯,那就說明成功了。
OK!沒問題,說明我們已經安裝成功了,那我們就開始寫代碼了。
識別驗證碼要識別驗證碼,那我們首先就要獲取驗證碼。
我一般有兩種常用的方式去獲取驗證碼。
第一種是通過接口保存驗證碼。
第二種是通過截圖保存驗證碼。
我們依次說明。
通過接口去獲取的話,我們是需要藉助requests這個包的。
這裡我們主要講識別驗證碼,requests我會在其他文章裡詳細的說明。
import requestsimport pytesseractfrom PIL import Image'''調用接口請求驗證碼,保存到本地,識別驗證,檢查識別的驗證碼對不對。'''url = hurl + "/file/getCaptcha1"headers = Nonequerystring = {"w": "70", "h": "29"}response = requests.request("GET", url, headers=headers, params=querystring, verify=False)img = response.contentwith open('F:\MyPython\TestCode\data\code.jpg', 'wb') as f: f.write(img)image = Image.open('F:\MyPython\TestCode\data\code.jpg')optCode = pytesseract.image_to_string(image)print("驗證碼:", optCode)
2、通過截圖保存驗證碼並識別。要截圖的話肯定需要界面,那麼我們就需要藉助selenium去操作了。
selenium這裡也不講,大家應該都會吧。
import pytesseractfrom PIL import Imagefrom 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)
總結簡單的來說,識別圖片,驗證碼,文字啊,都可以這樣子操作。
但是驗證碼的處理遠遠沒有這麼簡單。
畢竟啊,現在的驗證碼是越來越變態。
希望大家可以靈活應用圖形處理方法。
可以嘗試下識別照片上的文字什麼的。