【工作记录】基于spiderflow+ocr实现图片验证码识别@20230906

news2025/1/16 0:50:40

声明: 本文引用的网站仅用于演示,如侵删。

背景

这两天收到运营同事一个关于需要登录的网站的数据爬取需求,登录同时需要填入图片验证码。
经过多次尝试,结合百度OCR可以完成图片验证码的获取和识别,特此记录。
希望能帮助到需要的朋友们。

前期准备

  1. 部署好的可访问的可视化爬虫spiderflow,可参考笔者之前的文章。

    • 可视化爬虫框架spiderflow入门及实战
    • 基于docker-compose快速部署springboot应用的实践
  2. 百度云OCR申请,可自行注册。

    • 个人认证可申请每月1000次的免费额度,企业认证每月2000次免费额度,测试足够了。
    • 认证完成后注册应用,选择支持OCR图片识别。
      百度云认证及OCR应用创建
  3. 一个有图片验证码的目标网站

    说明:

    图片验证码的数据及展现形式有多种,如后端直接返回文件流,返回base64,前端自行渲染等,

    本文仅讨论后端返回文件流和base64的两种情况。

开始

1. spiderflow集成ocr

这一步有现成的插件可以用,在gitee 上搜索spider-flow-ocr即可。
附地址参考: spider-flow OCR插件

用法也比较简单,在spider-flow-web的pom文件中添加如下依赖即可

<dependency>
 	<groupId>org.spiderflow</groupId>
 	<artifactId>spider-flow-ocr</artifactId>
 	<version>${spider-flow.version}</version>
</dependency>

添加完成后重新运行spiderflow项目,访问首页可看到如下页面:
OCR配置列表页面
点击添加OCR配置,进入配置页面,填入百度云创建的应用对应的参数。
新增OCR配置
应用参数演示
同时在爬虫列表页面点击添加爬虫,看到如下图标及配置即表示OCR集成成功。
OCR组件演示

2. 获取验证码数据

首先找到获取验证码的链接,一般都可以在F12中找到对应请求,将请求记录下来,有的网站甚至需要添加指定的cookie或者请求头。

这里我使用的网站的验证码数据效果是这样的:
图片验证码获取连接示例
请求关键属性示例
截图所示为关键请求头数据,除Cookie外其余属性需要添加到Header中。

PS: 如果上面的请求头不能正确返回数据,可尝试复制所有的请求头到spiderflow中。

3. 完成识别并查看结果

通过2的演示可以看到这里返回的直接就是一张图片,我们现在有两种思路:

  • 保存图片到临时目录,再上传图片到OCR
  • 直接提交byte到OCR

接下来就这两种思路分别做实现,同时也演示下spiderflow中文件和流的使用。

3.1 先保存到本地再上传

3.1.1 新建爬虫,并拖拽组件

如下图:

爬虫流程图演示一
爬虫组件除配置URL外还需要加入对应的cookie和header,cookie和header均支持批量添加,还是挺方便的。

3.1.2 配置文件保存

文件保存
用到了file.write方法,有三个参数,第一个是存储路径,第二个是个InputStream流,第三个是append参数,这里是false。

这样文件就存储到了/tmp/result.png中,后面运行后我们再验证。

3.1.3 配置OCR

OCR配置示例

3.1.4 输出结果

请添加图片描述

3.1.5 结果验证

保存并运行,查看/tmp/result.png文件是否存在,同时验证结果输出是否正确,效果如下:

本地文件查看
结果输出验证
可以看到文件存在且文件对应的验证码和输出的验证码一致,实验结束。

总的来说,整个流程还是非常简单的,借助于spiderflow非常优秀的插件机制,ocr插件的出现使得ocr的使用非常方便,给作者点个大大的赞。

当然这个ocr插件只实现了百度OCR的集成,如果需要别的平台可参考添加实现即可。

3.2 直接上传并识别

上面我们实现了文件保存到本地再上传到ocr的过程,可以说是为了验证。接下来我们直接上传http响应到ocr来实现。

3.2.1 新建爬虫,拖拽组件如下图

直接上传实例一
相比上个实现过程少了保存文件的过程,可想而知也就没有了读取文件的过程

3.2.2 爬虫配置

爬虫配置与3.1.1中配置一致,配置URL, header和cookie,不再赘述。

3.2.3 OCR配置

OCR配置

3.2.4 输出结果

配置同3.1.4,运行结果如下图:

结果展示

4. 获取base64对应的验证码

思路一: 解析base64为本地图片,再上传

关于解析base64为本地图片,原代码是有点问题的,简单调整下即可,涉及文件FileFunctionExecutor.java

需要添加和修改的方法如下:

/**
 * 新添加的方法,兼容图片的base64编码
 */
private static byte[] toBytes(String content, String charset){
    if(content.startsWith("data:")){
        String data = content.substring(content.indexOf(",") + 1);
        BASE64Decoder decoder = new BASE64Decoder();
        try {
            //Base64解码
            byte[] b = decoder.decodeBuffer(data);
            for (int i = 0; i < b.length; ++i) {
                if (b[i] < 0) {
                    //调整异常数据
                    b[i] += 256;
                }
            }
            return b;
        }catch(Exception ex) {
            ex.printStackTrace();
        }
    }
    return StringFunctionExecutor.bytes(content, charset);
}

/**
 * toBytes方法使用
 * 修改原有方法
 */
@Comment("写出文件")
@Example("${file.write('e:/result.html',resp.html,'UTF-8',false)}")
public static void write(String path,String content,String charset,boolean append) throws IOException{
    write(path,toBytes(content, charset),append);
}

关于字符串转byte数组,原文件中是直接调用StringFunctionExecutor.bytes(content, charset)来完成的,这种并不能兼容图片的base64,所以做了个简单的调整。

对应爬虫的流程图配置如下:
base64演示一
查看本地图片,如下:
base64转本地图片
可以看到文件可以正常转换及存储, 接下来就可以上传这个文件到OCR实现识别了,步骤同3.1

这种方式不一定是最优解,确实能想到的最直接的办法(想到了另一种方式,暂且保留吧)

PS: 这里为了示例随便找了个图片通过在线转的base64,实际情况一般是通过接口获取。

思路二:获取到图片对应的base64字符串的byte数组

聪明的小伙伴一定都猜到了,这里要改写base64解码的相关代码了。

涉及到的类Base64FunctionExecutor.java, 具体实现留给各位小伙伴去探索吧。

思路三:各位小伙伴有更好的主意欢迎留言

到此本文要介绍的内容就结束了。

总结

本文介绍了基于spiderflow+ocr插件实现的图片验证码的获取与识别,整体过程相对来说比较简单,希望能对大家有所帮助吧。

spiderflow提供了非常优秀的插件机制,具备很高的扩展性,值得我们学习和研究,同时提供了很多很实用的方法。

实现了验证码的获取和识别,离实现登录又近了一步,为难的是网站提交的密码数据是加密后的,即使知道了用户名密码也要找到正确的加密算法才行,需要用到js逆向,还是得继续努力呀~~~~

如果本文对你有所帮助,欢迎一键三连~~~

针对以上内容或者spiderflow有任何疑问欢迎留言交流~~~~

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

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

相关文章

解决readme.md文件中粘贴的图片放到GitHub上无法显示问题

问题原因 GitHub的README.md文件通常无法直接引用本地文件或图片&#xff0c;因为GitHub的README.md是在远程服务器上渲染和显示的&#xff0c;无法访问本地文件系统。 解决方案 要在GitHub的README.md中显示图片&#xff0c;你需要将图片上传到GitHub上&#xff0c;然后使用图…

多维时序 | MATLAB实现GWO-BiLSTM灰狼算法优化双向长短期记忆神经网络的多变量时间序列预测

多维时序 | MATLAB实现GWO-BiLSTM灰狼算法优化双向长短期记忆神经网络的多变量时间序列预测 目录 多维时序 | MATLAB实现GWO-BiLSTM灰狼算法优化双向长短期记忆神经网络的多变量时间序列预测预测效果基本介绍模型描述程序设计参考资料 预测效果 基本介绍 MATLAB实现CNN-BiGRU-A…

完成Centos上使用SSH公钥进行免密上传文件到gitee的步骤后,测试免密推送到gitee的时候还是需要输入邮箱和密码

如果你已经按照正确的步骤设置了SSH公钥并进行了免密测试&#xff0c;但仍然需要输入邮箱地址和密码才能推送到gitee&#xff0c;那么可能有以下几种原因&#xff1a; 您可能没有使用SSH URL来推送代码。请确保您使用的是SSH URL而不是HTTPS URL来推送代码。您可以使用命令 gi…

SimVODIS++: Neural Semantic Visual Odometry in Dynamic Environments 论文阅读

论文信息 题目&#xff1a;SimVODIS: Neural Semantic Visual Odometry in Dynamic Environments 作者&#xff1a;Ue-Hwan Kim , Se-Ho Kim , and Jong-Hwan Kim , Fellow, IEEE 时间&#xff1a;2022 来源&#xff1a; IEEE ROBOTICS AND AUTOMATION LETTERS&#xff08;RAL…

⛳ MVCC 原理详解

&#x1f38d;目录 ⛳ MVCC 原理详解&#x1f43e; 一、事务回顾&#x1f4d0; 1.1、什么是数据库事务&#xff0c;为什么要有事务&#x1f389; 1.2、事务包括哪几个特性&#xff1f;&#x1f38d; 1.3、事务并发存在的问题1.3.1、脏读1.3.2、不可重复读1.3.3、幻读 &#x1f…

【Spring Boot】SpringBoot 2.6.6 集成 SpringDoc 1.6.9 生成swagger接口文档

文章目录 前言一、SpringDoc是什么&#xff1f;二、使用步骤1.引入库2.配置类3.访问测试 总结其他配置立个Flag 前言 之前常用的SpringFox在2020年停止更新了&#xff0c;新项目集成SpringFox出来一堆问题&#xff0c;所以打算使用更活跃的SpringDoc&#xff0c;这里简单介绍一…

【双向传输ConvLSTM网络:Pan-Sharpening】

D2TNet: A ConvLSTM Network With Dual-Direction Transfer for Pan-Sharpening (D2TNet:用于泛锐化的双向传输ConvLSTM网络) 在本文中&#xff0c;我们提出了一种有效的卷积长短期记忆(ConvLSTM)网络&#xff0c;具有双向传输的泛锐化&#xff0c;称为D2TNet。我们设计了一个…

【ARM CoreLink 系列 3 -- CCI-550 控制器介绍 】

文章目录 CCI FamilyCCI-550 简介CCI-550 功能CCI-550 Interfaces Snoop filter 使用背景CCI-550 Snoop filter 上篇文章&#xff1a;ARM CoreLink 系列 2 – CCI-400 控制器简介 CCI Family CCI-550 简介 Arm CoreLink CCI-550 Cache Coherent Interconnect 扩展了 CoreLink…

sentinel加密狗使用及规则配置

Sentinel加密狗是一种硬件加密设备&#xff0c;用于保护软件应用程序免受未经授权的访问和复制。它可以提供软件许可管理、访问控制和数据保护等功能。下面是Sentinel加密狗的使用及规则配置的相关介绍。 Sentinel加密狗的使用 插入加密狗&#xff1a;将Sentinel加密狗插入计算…

用滑动条做调色板---cv2.getTrackbarPos(),cv2.creatTrackbar()

滑动轨迹栏作调色板 cv.createTrackbar(‘R’, ‘image’, 0, 255, nothing) 参数&#xff1a;哪个滑动轨迹栏&#xff0c;哪个窗口&#xff0c;最小值&#xff0c;最大值&#xff0c;回调函数 cv.getTrackbarPos(‘R’, ‘image’) 参数&#xff1a;轨迹栏名&#xff0c;窗口…

IMAU鸿蒙北向开发-2023年9月5日学习日志

1. 5种调试方式 1.1 Previewer 在侧边 Previewer 选项卡内可以预览Entry。 如果要单独预览组件&#xff0c;可以在给组件加Preview 装饰器 1.2 Local Emulator&#xff08;本地模拟&#xff09; 1.3 Remote Emulator&#xff08;远程模拟&#xff09; 使用时需要登录华为开发…

FSK解调技术的FPGA实现

本原创文章由深圳市小眼睛科技有限公司创作&#xff0c;版权归本公司所有&#xff0c;如需转载&#xff0c;需授权并注明出处 一、FSK信号的解调原理 FSK信号的解调也有非相干和相干两种&#xff0c;FSK信号可以看作是用两个频率源交替传输得到的&#xff0c;所以FSK的接收机由…

[构建 Vue 组件库] 小尾巴 UI 组件库 —— 横向商品卡片(仿淘宝)

文章归档于&#xff1a;https://www.yuque.com/u27599042/row3c6 组件库地址 npm&#xff1a;https://www.npmjs.com/package/xwb-ui?activeTabreadmegitee&#xff1a;https://gitee.com/tongchaowei/xwb-ui 下载 npm i xwb-ui配置 按需导入 import {组件名 } from xwb-…

css中flex和flex-grow的区别

设置了1个class为parent且宽度为700px的div父级元素&#xff1b; 它有3个子元素&#xff0c;分别宽高为100px&#xff1b; 其中item2的元素flex值为1&#xff0c;item3的元素flex值为2 <!DOCTYPE html> <html lang"en"> <head><style>.pare…

车船边缘网关是如何给车辆船只定位的?

随着智能交通系统的不断发展&#xff0c;车路协同成为了重要的研究方向之一。而AI边缘计算网关在这个领域中发挥着至关重要的作用。本文将重点介绍AI边缘计算网关在车路协同中的应用&#xff0c;并强调其中的重点词汇或短语。 首先&#xff0c;什么是AI边缘计算网关&#xff1…

华为数据管理——《华为数据之道》

数据分析与开发 元数据是描述数据的数据&#xff0c;用于打破业务和IT之间的语言障碍&#xff0c;帮助业务更好地理解数据。 元数据是数据中台的重要的基础设施&#xff0c;元数据治理贯彻数据产生、加工、消费的全过程&#xff0c;沉淀了数据资产&#xff0c;搭建了技术和业务…

Python实现猎人猎物优化算法(HPO)优化卷积神经网络分类模型(CNN分类算法)项目实战

说明&#xff1a;这是一个机器学习实战项目&#xff08;附带数据代码文档视频讲解&#xff09;&#xff0c;如需数据代码文档视频讲解可以直接到文章最后获取。 1.项目背景 猎人猎物优化搜索算法(Hunter–prey optimizer, HPO)是由Naruei& Keynia于2022年提出的一种最新的…

ps显示msvcp140.dll丢失的解决方法,四个解决方法分享

我想和大家分享一个关于ps显示msvcp140.dll丢失的问题以及解决方法。这个问题可能会困扰很多使用Photoshop软件的朋友&#xff0c;特别是在运行某些特定功能时&#xff0c;会出现“无法运行此程序&#xff0c;因为找不到”的错误提示。那么&#xff0c;如何解决这个问题呢&…

现在嵌入式行业工作起薪是多少呢?发展怎么样?

今天闲逛看到有位毕业大学生询问的问题&#xff0c;我就来客观讨论一下&#xff0c;其实工作方面都是起薪多少取决于你个人的学历&#xff0c;能力等背景。嵌入式岗位的就业比起其他很多工程师岗位算还不错的&#xff0c;但是不如互联网&#xff0c;这一点不用质疑。起薪多少这…

element-plus中更改分页器的文字

实现&#xff1a; main.ts 文件中增加如下代码&#xff1a; import zhCn from element-plus/es/locale/lang/zh-cn // 自定义文字&#xff08;使用默认文字不用设置&#xff09; zhCn.el.pagination.goto 跳转到 zhCn.el.pagination.pageClassifier 页 // 创建应用实例对象 c…