爬虫知识 – 验证码处理(九)

验证码的处理

一、验证码的处理

1. 什么是图片验证码?
2. 验证码的作用
3. 图片验证码使用场景

二、图片验证码的处理方案

1. OCR识别

1. Tesseract简介
2. Tesseract引擎的安装
3. Tesseract中文语言模型配置
4. Python库安装

2. ddddocr识别

1. 图片的形式和转化
2. ddddocr-开源项目
3. 打码平台识别

3. 价格体系

1. 价格体系
2.开发文档

4. 人工识别

总结


一、验证码的处理

1. 什么是图片验证码?

验证码(CAPTCHA)是“Completely Automated Public Turing test to tell Computers and Humans Apart”(全自动区分计算机和人类的图灵测试)的缩写,是一种区分用户是计算机还是人的公共全自动程序。

2. 验证码的作用

防止恶意破解密码、刷票、论坛灌水、刷页。有效防止某个黑客对某一个特定注册用户用特定程序暴力破解方式进行不断的登录尝试,实际上使用验证码是现在很多网站通行的方式(比如招商银行的网上个人银行,百度社区),我们利用比较简易的方式实现了这个功能。虽然登录麻烦一点,但是对网友的密码安全来说这个功能还是很有必要,也很重要。

3. 图片验证码使用场景

注册、登录、频繁发送请求时,服务器弹出验证码进行验证

二、图片验证码的处理方案

手动输入(input):这种方法仅限于登录一次就可持续使用的情况
图像识别引擎解析:使用光学识别引擎处理图片中的数据,目前常用于图片数据提取,较少用于验证码处理
打码平台: 爬虫常用的验证码解决方案

1. OCR识别

OCR(Optical Character Recognition)是指使用扫描仪或数码相机对文本资料进行扫描成图像文件,然后对图像文件进行分析处理,自动识别获取文字信息及版面信息的软件。

在读取和处理图像、图像相关的机器学习以及创建图像等任务中,Python 一直都是非常出色的语言。虽然有很多库可以进行图像处理,但在这里我们只重点介绍:Tesseract

1. Tesseract简介

Tesseract 是一个 OCR 库,目前由 Google 赞助(Google 也是一家以 OCR 和机器学习技术闻名于世的公司)。Tesseract 是目前公认最优秀、最精确的开源 OCR 系统,除了极高的精确度,Tesseract 也具有很高的灵活性。它可以通过训练识别出任何字体,也可以识别出任何 Unicode 字符。

2. Tesseract引擎的安装

windows引擎环境安装

安装包链接:https://pan.baidu.com/s/1hGD-DeQRNE0rIaHNJnNQnw?pwd=qkur 提取码: qkur

下载引擎安装包,直接安装。安装方式:–>直接双击安装包 –>选择安装路径 –> 后续所有选项点 “下一步” 安装。

配置环境变量,安装完后如果要在计算机正常使用需要在计算机中配置环境变量,步骤如下所示:

右键点击此电脑, 选择属性

选择点击 高级系统设置
图片[1] - 爬虫知识 – 验证码处理(九) - 宋马
选择点击 环境变量

图片[2] - 爬虫知识 – 验证码处理(九) - 宋马
系统变量 中双击 Path
图片[3] - 爬虫知识 – 验证码处理(九) - 宋马
Tesseract引擎安装的根路径添加到环境变量中去
图片[4] - 爬虫知识 – 验证码处理(九) - 宋马
依次点击 确定 使环境变量生效
图片[5] - 爬虫知识 – 验证码处理(九) - 宋马
打开cmd验证,输入tesseract -v 验证,出现如下说明你配置好了
图片[6] - 爬虫知识 – 验证码处理(九) - 宋马
Mac系统引擎环境
详细步骤可以参考此文章:Mac电脑配置Tesseract

Linux系统引擎环境安装
可以通过指令在线安装

sudo apt-get update
sudo apt-get install tesseract-ocr

3. Tesseract中文语言模型配置

Tesseract各个国家语言地区文字模型在GitHub可以自行下载,以下是下载链接:
Tesseract中文语言模型

下载中文语言模型,如图:
图片[7] - 爬虫知识 – 验证码处理(九) - 宋马
Windows配置中文模型

中文语言模型配置主要是要将模型文件放到引擎的安装目录下

将中文模型放到引擎的 安装目录/tessdata 的目录下
图片[8] - 爬虫知识 – 验证码处理(九) - 宋马
Mac配置中文模型
参考此文章:Mac电脑配置Tesseract

Linux配置中文模型
Linux系统下通过apt get指令安装的工具默认是在~/etc下,进入到tesseract安装路径下share下面的tessdata文件夹下,将中文语言包拷贝进去即可

4. Python库安装

pillow模块主要用于打开图片文件,注意此模块安装名和导入名不一样:pip install pillow
pytesseract模块用于从图片中解析数据:pip install pytesseract

2. ddddocr识别

1. 图片的形式和转化

图片在网页页面中的形式

图片在网页页面中的形式一般就两种:一种是以一个链接形式存在html中,另外一种是以字符串的形式存在于html中。

● 以链接形式存在于html中的图片,意味着每次浏览器执行渲染的时候会发送图片链接地址请求,请求到了之后再渲染到页面。目前大部分网站都是以这种形式去加载图片的。之前我们也学习过通过获取图片的链接地址就可以请求图片数据。

图片[9] - 爬虫知识 – 验证码处理(九) - 宋马
这样的形式存在于页面当中的图片,如果一旦页面图片很多的话,就意味着需要发送很多次网络请求,去请求图片数据。

● 以字符串形式存在于html中的图片,和上述形式有明显的区别。这样形式的图片在html页面中是以字符串的形式去展示图片,而不是一个链接。
图片[10] - 爬虫知识 – 验证码处理(九) - 宋马
这样的好处是加载页面的时候,不用发送网络请求去请求图片数据。因为我们在请求html页面的时候就已经拿到图片的字符串数据,浏览器只需要转换图片为二进制形式展示就可以了。

有利也有弊,这样做虽然网络请求的次数少了,但是我们需要把图片转换成字符串形式才可以放到标签里面。如果图片数据过大,那么转换之后的字符长度就会很长。所以一般网页中字符串形式的图片都是数据量比较小的图片,比如验证码。

如何进行图片形式的转化

前面我们讲了图片有两种形式,链接形式的图片我们通过requests发送请求就可以拿到图片的二进制数据,保存下来就可以用看图软件查看。这种形式的图片处理就不做赘述了。

那么字符串的形式的图片我们应该如何处理呢?字符串形式的图片我们可以借助 base64 模块进行处理。
base64.b64decode()
把字符串形式的图片转化为二进制的数据, 传入图片的字符串数据

base64.b64encode()
把二进制形式的图片转化为字符串数据, 传入图片的二进制数据

2. ddddocr-开源项目

ddddocr是由sml2h3开发的专为验证码厂商进行对自家新版本验证码难易强度进行验证的一个python库,其由作者与kerlomz共同合作完成,通过大批量生成随机数据后进行深度网络训练,本身并非针对任何一家验证码厂商而制作,本库使用效果完全靠玄学,可能可以识别,可能不能识别。 —— 官方文档简介说明

ddddocr奉行着开箱即用、最简依赖的理念,尽量减少用户的配置和使用成本,希望给每一位测试者带来舒适的体验—— 官方文档简介说明

开源地址:ddddocr开源地址

ddddocr安装

pip install ddddocr==1.4.11

注意:因为安装过程中会自动安装验证码识别模型,模型文件比较大,因此没有配置国内镜像源的话极有可能安装超时

ddddocr使用

"""创建识别对象"""
ocr = ddddocr.DdddOcr(beta=True)  # 指定识别模型
"""打开图片数据"""
with open("test.png", 'rb') as f:
    image = f.read()
    
"""识别验证码"""
res = ocr.classification(image)
print(res)

经测试,对于一些验证码字符重叠的情况识别准确率较低。

注意事项:ddddocr 底层会调用 pillow 模块,受模块版本适配的影响,可能会出现如下报错:

图片[11] - 爬虫知识 – 验证码处理(九) - 宋马
原因是在pillow的高版本10.0.0版本中,ANTIALIAS方法被删除了,可以执行以下两句指令降低 pillow 版本解决

pip uninstall -y Pillow
pip install Pillow==9.5.0

3. 打码平台识别

现在很多网站都会使用验证码来进行反爬,所以为了能够更好的获取数据,需要了解如何使用打码平台破解爬虫中的验证码。

相比于复杂繁琐的验证码破解,打码平台能够给你快速的解决方案。今天我们就通过 快识别 验证码平台学习对接验证码平台识别验证码。
目标网站:http://www.kuaishibie.cn/

3. 价格体系

1. 价格体系

看打码平台首先应该了解就是价格体系,那是实实在在的真金白银。

● 快识别价格体系
图片[12] - 爬虫知识 – 验证码处理(九) - 宋马
相对于其他打码平台,快识别价格还是比较公道的。普通的验证码2厘钱一次,意味着普通验证码一元可以打500次。

2.开发文档

每个打码平台既然给用户提供服务,那么就会提供一系列服务接口供用户使用。以及这些接口往往都会以开发文档的形式教用户怎么去使用。以下是快识别的开发文档:

注意快识别开发文档在页面更新不及时,可以查看最新文档在线地址,地址在上图标红处。

开发文档中对应的有各个语言的示例接口,我们对应的选择python的示例接口自己去实现就好了,示例接口如下所示:

import base64
import json
import requests
# 一、图片文字类型(默认 3 数英混合):
# 1 : 纯数字
# 1001:纯数字2
# 2 : 纯英文
# 1002:纯英文2
# 3 : 数英混合
# 1003:数英混合2
#  4 : 闪动GIF
# 7 : 无感学习(独家)
# 11 : 计算题
# 1005:  快速计算题
# 16 : 汉字
# 32 : 通用文字识别(证件、单据)
# 66:  问答题
# 49 :recaptcha图片识别
# 二、图片旋转角度类型:
# 29 :  旋转类型
# 1029 :  背景匹配旋转类型 注意:中间小图传到image中,背景图传到imageback 中 imageback模仿image 添加
# 2029 :  背景匹配双旋转类型 注意:中间小图传到image中,背景图传到imageback 中  imageback模仿image 添加
#
# 三、图片坐标点选类型:
# 19 :  1个坐标
# 20 :  3个坐标
# 21 :  3 ~ 5个坐标
# 22 :  5 ~ 8个坐标
# 27 :  1 ~ 4个坐标
# 48 : 轨迹类型
#
# 四、缺口识别
# 18 : 缺口识别(需要2张图 一张目标图一张缺口图)
# 33 : 单缺口识别(返回X轴坐标 只需要1张图)
# 34 : 缺口识别2(返回X轴坐标 只需要1张图)
# 五、拼图识别
# 53:拼图识别
def base64_api(uname, pwd, img, typeid):
    with open(img, 'rb') as f:
        base64_data = base64.b64encode(f.read())
        b64 = base64_data.decode()
    data = {
            "username": uname, "password": pwd, "typeid": typeid, "image": b64}
    result = json.loads(requests.post("http://api.ttshitu.com/predict", json=data).text)
    if result['success']:
        return result["data"]["result"]
    else:
        #!!!!!!!注意:返回 人工不足等 错误情况 请加逻辑处理防止脚本卡死 继续重新 识别
        return result["message"]
    return ""


if __name__ == "__main__":
    img_path = "C:/Users/Administrator/Desktop/file.jpg"
    result = base64_api(uname='你的账号', pwd='你的密码', img=img_path, typeid=3)
    print(result)

4. 人工识别

最后讲解的方法听起来似乎很笨:人工识别。通常网站只需登录一次便可爬取,在其他识别方式不管用时,人工识别一次验证码也是可行的,其实现也非常简单。

在下载完验证码图片后,调用 Image.show 方法将图片显示出来,然后调用Python内置的input函数,等待用户肉眼识别后输入识别结果。

# pillow显示图片示例
from PIL import Image
im = Image.open('test.png')
im.show()

总结

对于验证码的识别,如果自己去处理图像,根据OCR去做识别, 实际上是十分困难且不讨好的。因为每个验证码是不同的,那么对于图像处理的机制也会不同。

那么有没有一些开源模块,已经训练好了模型。可供我们直接调用呢?ddddocr就是这么一个开源项目,将已经训练好的模型开源免费供所有人去调用。但是经过测试对于一些验证码字符重叠的情况识别准确率较低,所以具有一定的缺陷,也希望以后识别模型会越来越完善。

上述两个方法都具有一定的缺陷性,那么打码平台就是一个很好的选择了,目前绝大多数打码平台的识别率是很高的,当然打码平台是需要付费的。

除了上述三种方法,咱们也可以手动输入验证码。针对验证码频次不高的时候,手动输入方便快捷,不失为一个没有办法的办法。

在识别验证码的时候,也会有识别错误的情况,那么可以用判断加重试的代码逻辑重复做识别,直到识别正确为止。


以上就是本章节的内容,感谢大家支持,喜欢的话,已关注、点赞+收藏,下期继续更新相关内容!!

© 版权声明
THE END
如果内容对您有所帮助,就支持一下吧!
点赞0 分享
评论 抢沙发

请登录后发表评论

    暂无评论内容