用python識別驗證碼

前言

經常大家在做自動化測試或者做網路爬蟲的時候,都很容易遇到驗證碼。

今天,我們就簡單的說下,怎麼用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 FilesTesseract-OCR

添加到環境變數PATH中

第二步、安裝Pytesseract和Pilllow包

打開cmd,使用pip工具依次安裝Pytesseract和Pilllow包

如圖所示:

第三步、檢查是否安裝成功

1、檢查tesseract-ocr

打開cmd,輸入tesseract

2、檢查Pytesseract和Pillow包

在python里導入試試吧,沒有報錯,那就說明成功了。

OK!沒問題,說明我們已經安裝成功了,那我們就開始寫代碼了。

識別驗證碼

要識別驗證碼,那我們首先就要獲取驗證碼。

我一般有兩種常用的方式去獲取驗證碼。

第一種是通過介面保存驗證碼。 第二種是通過截圖保存驗證碼。

我們依次說明。

1、通過介面保存驗證碼並識別。

通過介面去獲取的話,我們是需要藉助requests這個包的。

這裡我們主要講識別驗證碼,requests我會在其他文章里詳細的說明。

import requestsimport pytesseractfrom 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:MyPythonTestCodedatacode.jpg, wb) as f: # 保存 f.write(img)# 用Image模塊打開上一步保存的驗證碼image = Image.open(F:MyPythonTestCodedatacode.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)

總結

簡單的來說,識別圖片,驗證碼,文字啊,都可以這樣子操作。

但是驗證碼的處理遠遠沒有這麼簡單。

畢竟啊,現在的驗證碼是越來越變態。

希望大家可以靈活應用圖形處理方法。

可以嘗試下識別照片上的文字什麼的。


推薦閱讀:

從零基礎開始一步步用python製作遊戲外掛!
爬蟲怎麼解決封IP?
SF 講堂推薦「使用 Python 和 TFlearn 深度學習的第一步」要開播啦
PyQt5系列教程(23):工具按鈕(QToolButton)

TAG:Python | 軟體測試 | 自動化測試 |