一、前言
前几天有人问我的框架在登录时支不支持用户名、密码以及验证码。我回答是不支持,因为验证码是为了防爬虫的,自动化遇到有验证码可以叫开发去掉或者写个万能验证码,那同学给我的回答是开发不愿意,只能自己搞。哈哈哈,怎么说呢,工作中学会说服开发也是自己的一种能力呢。好的,下面开始研究识别图形码的案例了。
二、tesserocr
参考:https://juejin.cn/post/6844903618605219848
1、tesserocr介绍
tesserocr是Python的一个OCR识别库,是google开源的OCR,但其实是对tesseract做了一层Python Api的封装。
OCR,全称叫 Optical Character Recognition,中文翻译叫光学字符识别,是指通过扫描字符,通过其形状将其翻译成电子文本的过程;
举例:当有一个图形验证码,先使用OCR技术将其转化成电子文本,然后爬虫将识别的结果提交到服务器,便达到自动识别验证码的过程;
还有个疑问,之前有在图形识别领域,还有个opencv的玩意,那这两者有什么区别?
答:opencv专注机器视觉,tesseract专注字符识别
所以从领域来说,opencv更广,而图形验证码,opencv也可以做,但杀鸡焉用牛刀~
2、环境准备
本人电脑配置:win10,python3.8,下面讲述的是在windows下的安装
1)安装tesseract
在Windows下,要先下载tesseract,它为tesserocr提供了支持;tesseract下载地址:https://digi.bib.uni-mannheim.de/tesseract/
其中文件名中带有dev的为开发版本,不带dev则为稳定版本,例如我这里是下载 tesseract-ocr-w64-setup-v5.3.0.20221214.exe;
下载后双击,一路点击,直到出现下面这个页面,这里需要勾选红框里的Additional language data(download),这个选项是安装OCR识别支持的语言包,这样OCR就可以识别多国语言,然后再一路点击NEXT即可,因为要下载语言包,所以需要点时间,大概10-20分钟左右,跟网速有关,如果不需要支持多国语言的话,也可以不勾选,自由选择。默认包含英文字库的
如果提示'tesseract' 不是内部或外部命令,则是因为没有配置环境变量,手动把tesseract根目录配置到path参数下即可,这块不详细说明。
到此为止,tesseract安装成功啦~
2)安装tesserocr
接下来就安装tesserocr了
方式一(不建议,一般安装不成功),尝试pip安装:pip3 install tesserocr pillow
方式二:通过.whl文件安装
下载地址:Releases · simonflueckiger/tesserocr-windows_build (github.com)
找到与tesseract对于版本的tesserocr(本人安装的tesseract v5.3.0.20221214,所以选择tesserocr-2.5.2-cp38-cp38-win_amd64.whl)
下载后,把下载下来的.whl文件放在任意路径下 ,然后通过pip命令安装该文件,举例文件放在了D:\software\tesser。
安装命令:pip install D:\software\tesser\tesserocr-2.5.2-cp38-cp38-win_amd64.whl
(这里pip install后面跟着的是自己下载好的.whl文件即可,tips:可以把文件直接拖到cmd窗口去)
如果pycharm中导入后调用方法报错,比如tesserocr._tesserocr.image_to_text报错问题。
可以将Tesseract-OCR下的tessdata文件复制到你的Python安装路径下即可
最终就安装上tesserocr啦~
如何验证是否真的安装了?很简单,直接import tesserocr,不报错就说明安装好了;
3、使用举例
1)图形验证码图片如下:
2)代码如下:
import tesserocr from PIL import Image #新建Image对象 image = Image.open("m.png") #进行置灰处理 image = image.convert('L') #这个是二值化阈值 150 threshold = 122 table = [] for i in range(256): if i < threshold: table.append(0) else: table.append(1) #通过表格转换成二进制图片,1的作用是白色,不然就全部黑色了 image = image.point(table,"1") image.show() result = tesserocr.image_to_text(image) print("验证码:"+result)
3)执行效果如下:
三、ddddocr
1、ddddocr介绍
项目地址:https://github.com/sml2h3/ddddocr
2、环境准备
python版本>3.8
pip命令安装: 方式一:pip install ddddocr方式二:pip install ddddocr
-
i https:
/
/
pypi.tuna.tsinghua.edu.cn
/
simple
/
3、使用举例
1)图形验证码图片如下:
2)代码如下:
import ddddocr ocr = ddddocr.DdddOcr() with open('m.png', 'rb') as f: img_bytes = f.read() res = ocr.classification(img_bytes) print('识别出的验证码为:' + res)
3)执行后效果如下:
四、pytesseract
1、pytesseract介绍
pytesseract是google的tesseract的一个python版本的接口库,想要真正使用,首先需要安装tesseract
2、环境准备
安装tesseract可以看第二大点,安装成功后再安装pytesseract,安装命令:pip install pytesseract
3、使用举例
1)图形验证码如下:
2)代码如下:
import pytesseract from PIL import Image pic = Image.open('1.png') imgry = pic.convert('L') imgry.show() threshold = 150 table = [] for i in range(256): if i < threshold: table.append(0) else: table.append(1) out = imgry.point(table, '1') out.show() #pic 为打开的图片,lang指定识别转换的语言库 text = pytesseract.image_to_string(pic,lang='chi_sim') print("验证码:"+text)
3)执行效果如下:
五、完整项目案例
1、网站地址https://www.qb5.tw/login.php
参考别人博客的,忘了博客地址了,这里主要实现登录时输入账号密码以及验证码的场景。
2、用ddddocr进行识别,完整代码如下
import requests from lxml import etree from requests.packages import urllib3 import ddddocr urllib3.disable_warnings() url = "https://www.qb5.tw/login.php" headers = { 'user-agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/92.0.4515.159 Safari/537.36' } # 1.创建session对象 session = requests.session() pag_text = session.get(url=url, headers=headers).text # 2.实例化一个etree对象,方便后面对页面进行数据解析 tree = etree.HTML(pag_text) # 3.提取验证码下载地址 img_path = "https://www.qb5.tw" + tree.xpath('//*[@id="main"]/div[1]/form/fieldset/p[3]/img/@src')[0] print(img_path) # 4.下载验证码,以二进制的方式进行保存 img_content = session.get(img_path, headers=headers, verify=False).content with open('./img.png', 'wb') as f: f.write(img_content) print('验证码图片下载成功') #img_code = input('请输入验证码:') ocr = ddddocr.DdddOcr() with open('img.png','rb') as f: img_bytes = f.read() code = ocr.classification(img_bytes) print("识别图形验证码为:"+code) # 5.进行登录,定义post的参数 data = { 'username': 'test123', 'password': 'admin@123', 'checkcode': code, 'usecookie': '315360000', 'action': 'login', 'submit': '立即登陆' } # 判断是否登录成功 response = session.post(url=url, data=data, headers=headers, verify=False) response.encoding = 'gbk' # 编码防止乱码 response_text = response.text if "登录成功" in response_text: print("登陆成功") # 请求个人信息页 ge = session.get(url='https://www.qb5.tw/userdetail.php', headers=headers, verify=False) with open('xs.html', 'w', encoding='gbk') as f: f.write(ge.text)
3、执行效果如下
六、结束语
tesserocr也只是识别手段的一种,如果需要高精度的识别,可以尝试TensorFlow实现深度学习模型,通过训练模型来识别图形验证码。
案例中的执行效果截图都可以识别出验证码,那是因为需要演示成功例子,实际上尝试了3种开源的ocr,识别精度都很低,如果工作中实在有需要用到,建议用百度或阿里的ocr,不过需要收费额~
标签:实战,img,Python,text,验证码,tesseract,安装,tesserocr From: https://www.cnblogs.com/Chilam007/p/17167518.html