Python反爬案例——验证码的识别

验证码的识别

使用打码平台识别验证码

利用打码平台可以轻松识别各种各样的验证码,图形验证码、滑动验证码、点选验证码和逻辑推理验证码。打码平台提供了一系列API,只需要向API上传验证码图片,它便会返回对应的识别结果。

使用超级鹰平台,官网:https://www.chaojiying.com/ ,首页如图所示:
在这里插入图片描述

超级鹰打码平台支持识别的内容包括但不限于:简单数字、字母、中文字符、滑动拼图验证等类型的验证码。同时,该平台还提供云端识别服务,可为所有软件提供验证码识别自动化解决方案,帮助客户进行验证码识别、远程答题、人工打码,以实现价值。

使用超级鹰打码平台进行验证码识别的步骤通常包括以下几点:

  • 注册并登录超级鹰打码平台的账号。
  • 下载需要识别的验证码图片,并将其保存在本地。
  • 调用平台提供的API或示例代码,将图片数据发送到超级鹰打码平台进行识别。
  • 接收平台返回的识别结果,并进行后续的操作。

通过这个平台,用户可以轻松地对各种类型的验证码进行识别,从而提高自动化流程的效率和准确性。

  1. 准备工作

安装两个Python库——opencv-python和Pillow,安装命令如下:

pip3 install opencv-python pillow

自行下载测试所用的验证码,地址为https://github.com/Python3WebSpider/CaptchaPlatform,可以先复制下来:

git clone [https://github.com/Python3WebSpider/CaptchaPlatform](https://github.com/Python3WebSpider/CaptchaPlatform).git

复制之后,本地出现一个CaptchaPlatform-master文件夹,内部存放的是测试需要的验证码图片。还有一个chaojiying.py文件,内容如下:

import requests
from hashlib import md5class Chaojiying(object):def __init__(self, username, password, soft_id):self.username = usernameself.password = md5(password.encode('utf-8')).hexdigest()self.soft_id = soft_idself.base_params = {'user': self.username,'pass2': self.password,'softid': self.soft_id,}self.headers = {'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/123.0.0.0 Safari/537.36',}def post_pic(self, im, codetype):"""im: 图片字节codetype: 题目类型 参考 http://www.chaojiying.com/price.html"""params = {'codetype': codetype,}params.update(self.base_params)files = {'userfile': ('ccc.jpg', im)}r = requests.post('http://upload.chaojiying.net/Upload/Processing.php', data=params, files=files,headers=self.headers)return r.json()def report_error(self, im_id):"""im_id:报错题目的图片ID"""params = {'id': im_id,}params.update(self.base_params)r = requests.post('http://upload.chaojiying.net/Upload/ReportError.php', data=params, headers=self.headers)return r.json()

定义了一个Chaojiying类,其构造方法接收三个参数。

  • username:超级鹰账户的用户名
  • password:超级鹰账户和密码
  • soft_id:软件ID,需要到超级鹰后台的“软件ID”中获取,如图所示,就生成一个软件ID928939:

在这里插入图片描述

这个类还实现了两个方法,post_pic方法用于上传验证码并获取识别结果,report_error方法用于上报识别错误,识别错误时不扣提分,就是不花钱。

以上内容都准备好后,开始识别验证码,首先是图像验证码。

在这里插入图片描述

  1. 图形验证码

这是一个由英文字母和数字组合而成的验证码,一共六位,查阅价格文档https://www.chaojiying.com/price.html,和这个验证码相符合的描述是“1-6位英文数字”,类型是“1006”,如图所示:

在这里插入图片描述

接着就可以编写实现代码:

from chaojiying import Chaojiying"""
USERNAME、PASSWORD、SOFT_ID需要更改为自己的用户名、密码和软件ID
"""
USERNAME = 'lxw1973'
PASSWORD = '2~~~-**w'
SOFT_ID = '928939'
CAPTCHA_KIND = '1006'
FILE_NAME = 'captcha1.png'
client = Chaojiying(USERNAME, PASSWORD, SOFT_ID)
result = client.post_pic(open(FILE_NAME, 'rb').read(), CAPTCHA_KIND)
print(result)

这里首先利用USERNAME, PASSWORD和SOFT_ID三个信息初始化了一个Chaojiying对象,赋值为client变量,然后调用client的post_pic方法上传了图片中的二进制内容,这里把post_pic方法的第二个参数设置为CAPTCHA_KIND,即1006。

返回结果如下:

{'err_no': 0, 'err_str': 'OK', 'pic_id': '2246121180794820046', 'pic_str': '6m44nn', 'md5': '275d14cb7a43b2ce7c9aa1745be2aafd'}

可以看到,返回结果中的pic_str字段出现了正确的识别结果,识别成功。

  1. 点选验证码

12306的验证码就是非常典型的一种点选验证码。如下图所示的点选验证码:

在这里插入图片描述

比较符合这个验证码的描述是“坐标多选”,类型是“9004”,会返回1~4个坐标,如图所示:

在这里插入图片描述

将“图形验证码”代码中的CAPTCHA_KIND改为9004,FILE_NAME改成captcha2.png,然后重新运行代码,结果如下:

{'err_no': 0, 'err_str': 'OK', 'pic_id': '2246121320794820047', 'pic_str': '94,121|206,139', 'md5': 'b7ab91737bc958b6dd47bf63921a615d'}

可以看到返回结果中的pic_str字段变成了’94,121|206,139’,使用OpenCV技术在上图中标注出这个点:

import cv2image = cv2.imread('captcha2.png')
image = cv2.circle(image, (94, 121), radius=10, color=(0,0,255), thickness=-1)
image = cv2.circle(image, (206,139), radius=10, color=(0,0,255), thickness=-1)
cv2.imwrite('captcha2_label_test.png', image)

运行结果如下图:

在这里插入图片描述

可以看到标注出来的正是第1张和第2张图片,没问题,验证成功!

另外,还有些验证码也属于点选类型,例如指定点击物品的颜色的验证码,如图所示:

在这里插入图片描述

指定文字点击顺序的验证码,如图所示:

在这里插入图片描述

要求按照语序点击文字的验证码,如图所示:

在这里插入图片描述

  1. 滑动验证码

我们再来验证滑块验证码,这里以下图为例进行讲解,如下图所示:

在这里插入图片描述

查阅价格文档,比较符合这个验证码的描述是“坐标选一”,类型是“9101”,如图所示:

在这里插入图片描述

和“点选验证码”类似,将“图形验证码”代码中国内地CAPTCHA_KIND改成9101,FILE_NAME改成captcha3.png,然后重新运行代码,得到如下结果:

{'err_no': 0, 'err_str': 'OK', 'pic_id': '1246122000794820048', 'pic_str': '204,90', 'md5': '66608b4a14544e3b3b36c56c94e1959d'}

可以看到返回结果中的pic_str字段变成了204,90,我们用OpneCV技术在例图上标注这个点:

import cv2image = cv2.imread('captcha3.png')
image = cv2.circle(image, (204, 90), radius=10, color=(0,0,255), thickness=-1)
cv2.imwrite('captcha3_label_test.png', image)

返回结果如下图:

在这里插入图片描述

可以在图片上做一些处理,例如添加自定义的文字,提醒标注人员哪里是正确的位置。下面使用OpenCV技术在例图上加一行字“请点击目标缺口的左上角”:

import cv2
from PIL import ImageFont, ImageDraw, Image
import numpy as np
import io
from chaojiying import ChaojiyingUSERNAME = 'lxw1973'
PASSWORD = '2~~~-**w'
SOFT_ID = '928939'
CAPTCHA_KIND = '9101'
def cv2_add_text(image, text, left, top, textColor=(255, 0, 0), text_size=20):image = Image.fromarray(cv2.cvtColor(image, cv2.COLOR_BGR2RGB))draw = ImageDraw.Draw(image)font = ImageFont.truetype('simsun.ttc', text_size, encoding='utf-8')draw.text((left, top), text, textColor, font=font)return cv2.cvtColor(np.asarray(image), cv2.COLOR_RGB2BGR)image = cv2.imread('captcha3.png')
image = cv2_add_text(image, '请点击目标缺口的左上角', int(image.shape[1]/10), int(image.shape[0]/2), (255,0,0), 40)
client = Chaojiying(USERNAME, PASSWORD, SOFT_ID)image = cv2.circle(image, (204, 90), radius=10, color=(0,0,255), thickness=-1)
client = Chaojiying(USERNAME, PASSWORD, SOFT_ID)
result = client.post_pic(io.BytesIO(cv2.imencode('.png', image)[1]).getvalue(), CAPTCHA_KIND)
print(result)

这里我们定义一个cv2_add_text方法,由于直接添加中文会产生乱码,所以需要借助Pillow库,并且依赖一个中文字体文件,添加文字后,图片如下所示:

在这里插入图片描述

重新运行代码,得到如下结果:

{'err_no': 0, 'err_str': 'OK', 'pic_id': '1246209360794820050', 'pic_str': '200,90', 'md5': '428e629f358f39a7d899a0f19a5852de'}

这时返回结果中的pic_str字段变成了200,90,标注一下这个点,结果如图所示:

在这里插入图片描述

  1. 问答验证码

再看一种验证码——问答验证码,样例图片入下图所示:

在这里插入图片描述

可以看到,验证码上有一个问题,并且在问题后的括号里有答案提示,问题中每个字的颜色、形状和字与字之间距离各不相同,背景中还有一些干扰线。

这种验证码,如果想自动化完成识别,难度是比较大的。首先需要识别出图片上的文字,这对正确率有很高的要求。在能正确提取所有文字并且问题相对简单的前提下,可以通过用爬虫模拟一些网络搜索操作获得结果。如果问题稍微复杂一些或者在网络上搜素不到答案,可以通过一些自然语言处理技术或者知识库获得答案。但总的来说,通过纯技术手段识别问答验证码的难度还是比较高的。

这样的验证码,比较合适的解决方案依然是打码平台,借助平台背后的人工力量完成识别。同样,查阅一下超级鹰平台对此类验证码的支持情况,如图所示:

在这里插入图片描述

可以看到6004类型是支持此类验证码的,我们把代码中的CAPTCHA_KIND改成6004,FILE_NAME改成captcha4.png,然后重新运行代码,得到如下结果:

from chaojiying import Chaojiying"""
USERNAME、PASSWORD、SOFT_ID需要更改为自己的用户名、密码和软件ID
"""
USERNAME = 'lxw1973'
PASSWORD = '~~~~-**w'
SOFT_ID = '928939'
CAPTCHA_KIND = '6004'
FILE_NAME = 'captcha4.png'
client = Chaojiying(USERNAME, PASSWORD, SOFT_ID)
result = client.post_pic(open(FILE_NAME, 'rb').read(), CAPTCHA_KIND)
print(result)运行结果如下:
{'err_no': 0, 'err_str': 'OK', 'pic_id': '2246210120794820051', 'pic_str': '大象', 'md5': '985c12e820556347a54f149111a40bba'}

返回结果中的pic_str字段是大象,回答正确,如此看来,打码平台着实非常强大。

更多的体验可以在小蜜蜂AI网站获取,网址为:https://zglg.work

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/786471.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

深入理解指针1:指针变量、指针运算、野指针、const修饰指针

生活中我们把门牌号也叫地址,在计算机中我们把内存单元的编号也称为地址。C语⾔中给地址起 了新的名字叫:指针。 所以我们可以理解为:内存单元的编号地址指针 1、指针变量 我们知道的是:数组名是数组首元素的地址。也就是说&…

中断服务程序模板

通常定时器初始化过程如下: ①对 TMOD赋值,以确定TO和T1的工作方式。 ②计算初值,并将初值写入THO、TLO或TH1、TL1。 ③中断方式时,则对IE赋值,开放中断。 ④使TRO或TR1置位,启动定时器/计数器定时或计数。 代码 利用定时器0工作方式1&…

轻松设置Facebook自动隐藏评论和删除评论功能

Facebook作为海外营销的最大流量平台之一,是很多跨境卖家争夺的市场,希望可以通过Facebook这个全球性的平台来推广自己的产品或服务。身处这个竞争激烈的市场,任何一条负面评论或不当言论出现在你的品牌页面上都可能影响到品牌形象&#xff0…

臻奶惠无人售货机:新零售时代的便捷消费革命

臻奶惠无人售货机:新零售时代的便捷消费革命 在新零售的浪潮中,智能无人售货机作为一个创新的消费模式,已经成为距离消费者最近的便捷购物点之一。这种模式不仅能够满足居民对消费升级的需求,还能通过建立多样化和多层次的消费体…

k8s练习-创建一个Deployment

创建Deployment 创建一个nginx deployment [rootk8s-master home]# cat nginx-deployment.yaml apiVersion: apps/v1 kind: Deployment metadata:name: nginx-deployment spec:selector:matchLabels:app: nginx # 配置pod的labelsreplicas: 2 # 声明2个副本template:metada…

spring boot自动配置原理-怎样回答这个问题

首先我们说一下自动配置的概念。 自动配置:遵循约定大约配置的原则,在boot程序启动后,起步依赖中的一些bean对象会自动注入到ioc容器 例子 程序引入spring-boot-starter-web 起步依赖,启动后,会自动往ioc容器中注入…

记一次 pdfplumber 内存泄漏导致的服务器宕机

有一个项目需求,要在每天凌晨5点的时候执行一个任务,获取一系列的PDF文件并解析。 后端是Django框架,定时任务用Celery来实现的。 本地跑没什么问题,但是一放到服务器上跑就会宕机,而且是毫无征兆的宕机,…

黑马HTMLCSS基础

黑马的笔记和资料都是提供好了的,这个文档非常适合回顾复习。我在黑马提供的笔记上做了一些微不足道的补充,以便自己复习查阅。该笔记比较重要的部分是 表单,http请求 第一章. HTML 与 CSS HTML 是什么:即 HyperText Markup lan…

使用虚拟引擎为AR体验提供动力

Powering AR Experiences with Unreal Engine ​​​​​​​ 目录 1. 虚拟引擎概述 2. 虚拟引擎如何为AR体验提供动力 3. 虚拟引擎中AR体验的组成部分是什么? 4. 使用虚拟引擎创建AR体验 5. 虚拟引擎中AR的优化提示 6. 将互动性融入AR与虚拟引擎 7. 在AR中…

5G PLMN相关概念

PLMN PLMN(Public Land Mobile Network,公用陆地移动网络),是由政府或其批准的经营者为公众提供陆地移动通信业务而建立、经营的网络。PLMN与公众交换电话网(PSTN)互连,形成整个地区或国家规模…

AR和VR如何改变客户体验?

How AR and VR are transforming customer experiences? How AR and VR are transforming customer experiences AR和VR如何改变客户体验 AR and VR technology was largely expedited by the past pandemic with at least 93.3 million and 58.9 million users r…

运筹学经典问题(八):CVRP和VRP-TW

文章目录 问题描述问题建模决策变量数学建模基于容量的消除子环的约束 (load-based SECs) CVRP完整的数学模型加上时间窗限制的CVRP 问题描述 给定一个图,图上的点代表客户,边代表客户之间的路线,边的权重代表客户之间…

Day60:WEB攻防-XMLXXE安全无回显方案OOB盲注DTD外部实体黑白盒挖掘

目录 XML&XXE-传输-原理&探针&利用&玩法 XXE 黑盒发现 XXE 白盒发现 XXE修复防御方案 有回显 无回显 XML&XXE-黑盒-JSON&黑盒测试&类型修改 XML&XXE-白盒-CMS&PHPSHE&无回显 知识点: 1、XXE&XML-原理-用途&…

MATLAB绘制堆叠填充图--巧用句柄

MATLAB绘制堆叠填充图–巧用句柄 目录 MATLAB绘制堆叠填充图--巧用句柄1. 主要原理讲解1.1 主要函数1.2 句柄原理 2. 绘图示例2.1 准备数据2.2 绘制堆叠填充图-使用句柄控制图形属性2.3 设置填充颜色和样式2.4 添加标题和标签2.5 绘图效果 3. 结语 堆叠填充图是一种常见的数据可…

政安晨:【Keras机器学习实践要点】(十三)—— 利用 TensorFlow 进行多 GPU 分布式训练

目录 前言 设置 单主机、多设备同步培训 工作原理 如何使用 使用回调确保容错 tf.data 性能提示 数据集批处理注意事项 调用 dataset.cache() 调用 dataset.prefetch(buffer_size) 政安晨的个人主页:政安晨 欢迎 👍点赞✍评论⭐收藏 收录专栏:…

ssm015基于java的健身房管理系统的设计与实现+vue

健身房管理系统设计与实现 摘 要 现代经济快节奏发展以及不断完善升级的信息化技术,让传统数据信息的管理升级为软件存储,归纳,集中处理数据信息的管理方式。本健身房管理系统就是在这样的大环境下诞生,其可以帮助管理者在短时间…

MacBook 访达使用技巧【mac 入门】

快捷键 打开访达搜索窗口默认快捷键【⌥ ⌘ 空格键】可以在键盘【系统偏好设置 -> 键盘->快捷键->聚焦】修改 但是我不会去修改它,因为我不常用访达的搜索窗口,更多的是想快速打开访达文件夹窗口,可以通过第三方软件定义访达的快…

利用Node.js实现拉勾网数据爬取

引言 拉勾网作为中国领先的互联网招聘平台,汇集了丰富的职位信息,对于求职者和人力资源专业人士来说是一个宝贵的数据源。通过编写网络爬虫程序,我们可以自动化地收集这些信息,为求职决策和市场研究提供数据支持。Node.js以其非阻…

Qt 实现简易的视频播放器,功能选择视频,播放,暂停,前进,后退,进度条拖拉,视频时长显示

1.效果图 2.代码实现 2.1 .pro文件 QT core gui multimedia multimediawidgets 2.2 .h文件 #ifndef VIDEOPLAYING_H #define VIDEOPLAYING_H#include <QWidget> #include<QFileDialog>#include<QMediaPlayer> #include<QMediaRecorder> #in…

vue3中播放flv流视频,以及组件封装超全

实现以上功能的播放&#xff0c;只需要传入一个流的地址即可&#xff0c;当然组件也只有简单的实时播放功能 下面直接上组件 里面的flvjs通过npm i flv.js直接下载 <template><div class"player" style"position: relative;"><p style&…