首页 > 编程语言 >Python识别图形验证码实战项目

Python识别图形验证码实战项目

时间:2023-03-01 17:57:28浏览次数:67  
标签:实战 img Python text 验证码 tesseract 安装 tesserocr

一、前言

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

二、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 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

相关文章

  • 如何确定我的 python shell 是以 32 位还是 64 位执行的?
    如何从shell内部判断shell处于什么模式?我试过查看平台模块,但它似乎只是告诉你“用于可执行文件的位架构和链接格式”。我的二进制文件被编译为64位(我在OSX10......
  • Python教程:类的继承,什么是继承
    一、什么是继承继承是一种新建类的方式,新建的类称为子类,被继承的类称为父类继承的特性是:子类会遗传父类的属性继承是类与类之间的关系二、为什么用继承使用继承可以......
  • Python数据分析之财政收入影响因素分析及预测模型
     01-summary.py 1#-*-coding:utf-8-*-23#代码6-145importnumpyasnp6importpandasaspd78inputfile='../data/data.csv'#输......
  • Python教程:类的派生
    一、派生派生:子类中新定义的属性的这个过程叫做派生,并且需要记住子类在使用派生的属性时始终以自己的为准1派生方法一(类调用)指名道姓访问某一个类的函数:该方式与继承......
  • CentOS 7上使用Python 3和虚拟环境
    在CentOS7上使用Python3和虚拟环境,请按照以下步骤操作:首先,确保您的系统已安装Python3。您可以使用以下命令检查Python3是否已安装:python3--version如果Python3已......
  • 算法刷题-表达式求值-PYTHON
    0x00引言为获取一个良好的算法思维,以及不再成为一个脚本小子,争取每天一道算法题,培养自己的逻辑思维,温顾各类型语言语法知识。题解只写自己理解的解法,其他解法不再增加。......
  • linux基本功之date命令实战
    前言在日常工作中,我们经常会用到date命令来判断任务执行的时间,或者使用date命令去实现时间段内的工作任务,今天我们一起来探讨下date命令一、date简介date英[deɪt]日期,时......
  • Python 中都有哪些常见的错误和异常?
    本文首发自「慕课网」,想了解更多IT干货内容,程序员圈内热闻,欢迎关注!作者|慕课网精英讲师朱广蔚Python程序的执行过程中,当发生错误时会引起一个事件,该事件被称为异常。例如......
  • 【自动化测试】airtest+python移动端测试实践
    Airtest框架基于python的测试框架,核心原理是基于python的内置unittest进行延申开发的测试框架,核心主要包含两个模块:airtest,poco airtest:(1)图像识别(2)封装了ad......
  • python numpy中的cumsum的用法
    1、函数作用该函数定义在multiarray.py中有定义defcumsum(self,axis=None,dtype=None,out=None):#realsignatureunknown;restoredfrom__doc__"""......