【Python技能樹共建】驗證碼實操2案例 r21
Python 驗證碼是什么
如果你是一個數據挖掘愛好者,那么驗證碼是你避免不過去的一個天坑,和各種驗證碼斗爭,必然是你成長的一條道路,
本篇文章為你帶來驗證碼的入門案例,來吧,一起 Coding 吧。
怎么用
數字+字母的驗證碼
我隨便在百度圖片搜索了一個驗證碼,如下
今天要做的是驗證碼識別中最簡單的一種辦法,采用pytesseract解決,它屬于 Python 當中比較簡單的OCR識別庫
使用pytesseract之前,你需要通過 pip 安裝一下對應的模塊 ,需要兩個
pytesseract 庫還有圖像處理的 pillow 庫了
pip install pytesseract pip install pillow
如果你安裝了這兩個庫之后,編寫一個識別代碼,一般情況下會報下面這個錯誤
pytesseract.pytesseract.TesseractNotFoundError: tesseract is not installed or it's not in your path
這是由于你還缺少一部分內容
安裝一個 Tesseract-OCR 軟件。這個軟件是由 Google 維護的開源的 OCR 軟件。
- > https://github.com/tesseract-ocr/tesseract/wiki
中文包的- > https://github.com/tesseract-ocr/tessdata
選擇你需要的版本進行下載即可
from PIL import Image, ImageFilter im = Image.open(‘1.png’) # 高斯模糊 im.filter(ImageFilter.GaussianBlur) # 普通模糊 im.filter(ImageFilter.BLUR) # 邊緣增強 im.filter(ImageFilter.EDGE_ENHANCE) # 找到邊緣 im.filter(ImageFilter.FIND_EDGES) # 浮雕 im.filter(ImageFilter.EMBOSS) # 輪廓 im.filter(ImageFilter.CONTOUR) # 銳化 im.filter(ImageFilter.SHARPEN) # 平滑 im.filter(ImageFilter.SMOOTH) # 細節 im.filter(ImageFilter.DETAIL)
format 屬性定義了圖像的格式,如果圖像不是從文件打開的,那么該屬性值為 None;
size 屬性是一個 tuple,表示圖像的寬和高(單位為像素);
mode 屬性為表示圖像的模式,常用的模式為:L 為灰度圖,RGB 為真彩色,CMYK 為 pre-press 圖像。如果文件不能打開,則拋出 IOError 異常。
注意安裝完畢,如果還是報錯,請找到模塊 pytesseract.py 這個文件,對這個文件進行編輯
一般這個文件在 C:\Program Files\Python36\Lib\site-packages\pytesseract\pytesseract.py 位置
文件中 tesseract_cmd = 'tesseract' 改為自己的地址 例如: tesseract_cmd = 'C:\Program Files (x86)\Tesseract-OCR\tesseract.exe'
如果報下面的 BUG,請注意
Error opening data file \Program Files (x86)\Tesseract-OCR\tessdata/chi_sim.traineddata Please make sure the TESSDATA_PREFIX environment variable
解決辦法也比較容易,按照它的提示,表示缺失了 TESSDATA_PREFIX 這個環境變量。你只需要在系統環境變量中添加一條即可
將 TESSDATA_PREFIX=C:\Program Files (x86)\Tesseract-OCR 添加環境變量
重啟 IDE 或者重新 CMD,然后繼續運行代碼,這個地方注意需要用管理員運行你的 py 腳本
步驟分為
打開圖片 Image.open()
pytesseract 識別圖片
import pytesseract from PIL import Image def main(): image = Image.open("1.jpg") text = pytesseract.image_to_string(image,lang="chi_sim") print(text) if __name__ == '__main__': main()
測試英文,數字什么的基本沒有問題,中文簡直慘不忍睹。空白比較大的可以識別出來。唉~不好用
當然剛才那個7364 十分輕松的就識別出來了。
帶干擾的驗證碼識別
接下來識別如下的驗證碼,我們首先依舊先嘗試一下。運行代碼發現沒有任何顯示。接下來需要對這個圖片進行處理
基本原理都是完全一樣的
彩色轉灰度
灰度轉二值
二值圖像識別
彩色轉灰度
im = im.convert('L')
灰度轉二值,解決方案比較成套路,采用閾值分割法,threshold 為分割點
def initTable(threshold=140): table = [] for i in range(256): if i < threshold: table.append(0) else: table.append(1) return table
調用
binaryImage = im.point(initTable(), '1') binaryImage.show()
調整之后
今天你要學習的驗證碼采用通過第三方 AI 平臺開放的 OCR 接口實現,OCR 文字識別技術目前已經比較成熟了,而且第三方比較多,今天采用的是百度的。
借用第三方平臺解決驗證碼
官方網址:http://ai.baidu.com/
接下來申請
接下來創建一個簡單應用之后,就可以使用了,我們找到
你需要具備基本的閱讀第三方文檔的能力,打開我們需要的文檔
https://cloud.baidu.com/doc/OCR/OCR-API.html
這個頁面基本上已經把我們需要做的所有內容都已經標識清楚了
在目前主流的 API 開發模式下,都是需要你進行 accesstoken 的獲取的
代碼如下 ,重點需要參照文檔進行傳參的設計
def get_accesstoken(self): res = requests.post(self.url.format(self.key,self.secret),headers=self.header) content = res.text if (content): return json.loads(content)["access_token"]
得到 accesstoken 之后,你可以繼續下面的操作
import requests import json import base64 import urllib.request, urllib.parse class GetCode(object): def __init__(self): self.url = "https://aip.baidubce.com/oauth/2.0/token?grant_type=client_credentials&client_id={}&client_secret={}" self.api = "https://aip.baidubce.com/rest/2.0/ocr/v1/general_basic?access_token={}" self.header = { "Content-Type":'application/json; charset=UTF-8' } self.key = "你的KEY" self.secret = "你的SECRET"
普通沒有干擾的驗證碼,我們直接識別即可,但是有的驗證碼還是有干擾的,在識別之前,需要對它進行基本的處理,我們采用和上篇文章類似的辦法進行,對它進行灰度處理和二值化操作。部分代碼我直接硬編碼了,不過最終識別的效果并沒有比想象的優化多少。
def init_table(self,threshold=155): table = [] for i in range(256): if i < threshold: table.append(0) else: table.append(1) return table def opt_image(self): im = Image.open("66.png") im = im.convert('L') im = im.point(self.init_table(), '1') im.save('66_s.png') return "66_s.png"
調用百度的驗證碼接口,不使用百度給的模塊直接編寫。按照它對應的文檔,書寫即可。
在這個地方尤其注意官方文檔提示
def get_file_content(self,file_path): with open(file_path, 'rb') as fp: base64_data = base64.b64encode(fp.read()) s = base64_data.decode() data = {} data['image'] = s decoded_data = urllib.parse.urlencode(data) return decoded_data def show_code(self): image = self.get_file_content(self.opt_image()) headers = { "Content-Type": "application/x-www-form-urlencoded" } res = requests.post(self.api.format(self.get_accesstoken()),headers=headers,data=image) print(res.text)
通過百度模塊調用驗證碼識別
pip install baidu-aip
安裝之后,就可以使用啦
聲明一些常量,你在百度創建應用之后就可以獲取
初始化文字識別類
調用對應的方法
from aip import AipOcr # 定義常量 APP_ID = '15736693' API_KEY = '你的KEY' SECRET_KEY = '你的SECRET' # 初始化文字識別 aipOcr=AipOcr(APP_ID, API_KEY, SECRET_KEY) # 讀取圖片 filePath = "1.jpg" def get_file_content(filePath): with open(filePath, 'rb') as fp: return fp.read() # 定義參數變量 options = { 'detect_direction': 'true', 'language_type': 'CHN_ENG', } # 網絡圖片文字文字識別接口 result = aipOcr.webImage(get_file_content(filePath),options) print(result)
擴展部分
這種通過第三方 OCR 技術識別驗證碼的方式,本質上和上篇文章的原理是一致的
在實測過程中發現,沒有太多干擾線,搜狗,騰訊,有道 基本表現一致
對于這種方式,學會即可~,道理都是一致的,當然你可以用 Python 實現一個圖片轉文字的小應用是沒有任何問題的
OCR Python
版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。