系統環境:3.7.4-64+win10
最近做批量登錄,網站的驗證碼還是挺簡單的,如果說接入打碼平台,那不划算了
驗證碼類似下圖
然后看了下ocr識別,比較方便的就是Tesseract,識別率還行
接下去就是python調用,常規對接方式就是先安裝teseract.exe,然后python調用接口
1.cmd直接調用
2.接入庫調用,比如pyocr等
這2中方式都不是很方便,第一種需要安裝軟件,第二種也要按照,而且把項目打包成exe也是個大問題,各種導入錯誤
那么有沒有其他方法呢,網上查閱后發現.net可以直接調用dll組件來識別,既然能調用dll,那么python自然也能調用
網上搜尋一番,果然有人已經給出了解決方案,參考如下,里面給出了32位和64位的調用方法,不過沒有給dll下載地址
https://www.polarxiong.com/archives/python-pytesser-tesseract.html
下載(32和64位都放進去了,按照自己需求使用)
鏈接:https://pan.baidu.com/s/19mFffGpLgtHq1f2tGzQqXw
提取碼:kr70
文件結構如下
tessdata是訓練數據,304是主dll,172是輔助,2個需要放在一起
main.py(64位調用方法,32位不同,參照上面連接)
import ctypes class OCR(): def __init__(self, DLL_PATH, TESSDATA_PREFIX, lang): self.DLL_PATH = DLL_PATH self.TESSDATA_PREFIX = TESSDATA_PREFIX self.lang = lang self.ready = False if self.do_init(): self.ready = True def do_init(self): self.tesseract = ctypes.cdll.LoadLibrary(self.DLL_PATH) self.tesseract.TessBaseAPICreate.restype = ctypes.c_uint64 self.api = self.tesseract.TessBaseAPICreate() rc = self.tesseract.TessBaseAPIInit3(ctypes.c_uint64(self.api), self.TESSDATA_PREFIX, self.lang) if rc: self.tesseract.TessBaseAPIDelete(ctypes.c_uint64(self.api)) print('Could not initialize tesseract.\n') return False return True def get_text(self, path): if not self.ready: return False self.tesseract.TessBaseAPIProcessPages( ctypes.c_uint64(self.api), path, None, 0, None) self.tesseract.TessBaseAPIGetUTF8Text.restype = ctypes.c_uint64 text_out = self.tesseract.TessBaseAPIGetUTF8Text(ctypes.c_uint64(self.api)) return bytes.decode(ctypes.string_at(text_out)).strip() if __name__ == '__main__': DLL_PATH = 'libtesseract304.dll' TESSDATA_PREFIX = b'./tessdata' lang = b'eng' ocr = OCR(DLL_PATH, TESSDATA_PREFIX, lang) image_file_path = b'test.png' result = ocr.get_text(image_file_path) print(result)
做了一下簡單的封裝,這樣就能簡單調用了,打包成exe也不會有問題,無需按照,綠色軟件
注意:dll需要放到和主程序相同的目錄,這里涉及到加載的問題,因為304dll加載需要172dll,如果在文件夾內,則會出現找不到dll
當然這是我水平有限的原因,暫時沒找到更好的方法,具體可以自己修改