在通过python3.5爬取大众点评商户数据和用户数据的时候,由于请求频繁,中间会出现高频次的验证码的输入,使用了tesseract,然后就是各种问题,对于在使用python3.5 的tesseract-ocr识别时候常见的两个错误总结一下,这两个问题解决的我心力憔悴啊。后来兄弟520号结婚我就回家了,回到公司的第一天然后解决好了,要写点把这个记录下
1.FileNotFoundError:[WinError 2] 系统找不到指定的文件The system cannot find the file specified:
解决方案:
方案1.看了很多网上的贴吧,将tesseract.exe添加到系统的环境变量path中
;C:\Program Files (x86)\Tesseract-OCR; 分号不能少,添加环境变量之后说是重启cmd或者pycharm,这个对我的是没有任何效果。折腾的我都重启电脑了,还是不行,然后采取其他方案。
方案2: 修改pytesseract.py文件,指定tesseract.exe安装路径
打开pytesseract的安装目录(这是我的目录:C:\Users\Administrator\venv\Lib\site-packages\pytesseract)找到 pytesseract.py文件
打开这个文件,找到
# CHANGE THIS IF TESSERACT IS NOT IN YOUR PATH, OR IS NAMED DIFFERENTLY
注释掉原本的
#tesseract_cmd='tesseract'
新增tesseract_cmd 为tesseract.exe的安装路径
tesseract_cmd= 'C:\\Program Files (x86)\\Tesseract-OCR\\tesseract.exe‘
这样系统找不到指定的文件这个错误就可以解决了。
这是第二个错误
2.解决上面的问题后运行代码又出错
pytesseract.pytesseract.TesseractError: (1, 'Error opening data file C:\\Program Files (x86)\\Tesseract-OCR;/eng.traineddata Please make sure the TESSDATA_PREFIX environment variable is set to your "tessdata" directory. Failed loading language \'eng\' Tesseract couldn\'t load any languages! Could not initialize tesseract.')
方案1:在网上各种游荡,添加 TESSDATA_PREFIX的环境变量,我也添加了,还是不可以,一直报上面的错误
虽然没有解决问题,但是是个经验,所以留下了。
方案2:配置中指定tessdata-dir
在代码中添加
pytesseract.pytesseract.tesseract_cmd = 'c://Program Files (x86)//Tesseract-OCR//tesseract.exe'
tessdata_dir_config = '--tessdata-dir "c://Program Files (x86)//Tesseract-OCR//tessdata"'
然后在指定的image_to_string配置下
image_to_string(image, lang = 'eng', config=tessdata_dir_config)
这个方式非常有效
下面贴识别简单验证码的代码及结果:
需要识别的验证码:
代码:
#! -*- coding:utf-8 -*-
import pytesseract
from PILimport Image
pytesseract.pytesseract.tesseract_cmd ='c://Program Files (x86)//Tesseract-OCR//tesseract.exe'
tessdata_dir_config ='--tessdata-dir "c://Program Files (x86)//Tesseract-OCR//tessdata"'
def main():
#这个图片路径是自己定义的
image = Image.open('E:\pycharmWorkspace\image\yanzhengma.png')
code = pytesseract.image_to_string(image, lang ='eng', config=tessdata_dir_config)
print (code)
if __name__ =='__main__':
main()
识别结果:
由于像素的影响,这个识别还不是很精确,会慢慢优化提高识别精度,大众点评是一块难啃的骨头啊,这篇文章到此为止,干活!