用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,輸入tesseract2、檢查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)