最新要闻

广告

手机

iphone11大小尺寸是多少?苹果iPhone11和iPhone13的区别是什么?

iphone11大小尺寸是多少?苹果iPhone11和iPhone13的区别是什么?

警方通报辅警执法直播中被撞飞:犯罪嫌疑人已投案

警方通报辅警执法直播中被撞飞:犯罪嫌疑人已投案

家电

每日速递:Python识别图形验证码实战项目

来源:博客园

一、前言

前几天有人问我的框架在登录时支不支持用户名、密码以及验证码。我回答是不支持,因为验证码是为了防爬虫的,自动化遇到有验证码可以叫开发去掉或者写个万能验证码,那同学给我的回答是开发不愿意,只能自己搞。哈哈哈,怎么说呢,工作中学会说服开发也是自己的一种能力呢。好的,下面开始研究识别图形码的案例了。

二、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是否安装成功?直接cmd下输入tesseract即可,成功会直接显示信息:

如果提示"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 installD:\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 tesserocrfrom PIL import Image#新建Image对象image = Image.open("m.png")#进行置灰处理image = image.convert("L")#这个是二值化阈值 150threshold = 122table = []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 ddddocrocr = 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 pytesseractfrom PIL import Imagepic = Image.open("1.png")imgry = pic.convert("L")imgry.show()threshold = 150table = []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 requestsfrom lxml import etreefrom requests.packages import urllib3import ddddocrurllib3.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).contentwith 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.textif "登录成功" 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,不过需要收费额~

关键词: 下载地址 登录成功 电子文本