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 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,不过需要收费额~

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章