实战解决百度旋转验证码

1、效果演示

2、如何识别

2.1准备数据集

首先需要使用爬虫,对验证码图片进行采集,尽量每一种类型都要采集到。

2.2图像矫正

接下来对采集的数据进行人工校正

2.3数据清洗

(1)对数据进行进行旋转,达到增加数据量的目的。

(2)对数据进行灰度化处理,将三维图片降为二维。

(3)对图片大小进行resize,可以提高训练速度。

# 图片转换部分,得到x
picture = Picture(path=img_path)
# 图像灰度化处理
temp_img = picture.gray()
# 图像resize
temp_img = temp_img.resize((50, 50), Image.LANCZOS)
# 获取y
word = img_path.split('\\')[-1].split('-')[0]# 结果包装成列表,保证x,y是一个整体,不被打乱
res = [np.array(temp_img),np.array(word)]
# 将结构给全局变量
result_list.append(res)
# 记录完成数量
complete_list.append(img_path)

2.4划分训练集与测试集

一般训练集占数据量的80%,测试集占总数据量的20%,当然也可以根据自己的情况调整比例。

2.5训练模型

这里可以使用CNN神经网络模型进行训练,效果非常不错。

2.6实战测试

下面直接上代码。其中的滑动系数可能需要自行调整,这个变动不会太频繁,可能几个月某度变一次。


__author__ = "detayun"import os
import sys
import time
import base64
import requests
from PIL import Image
from io import BytesIO
sys.path.append(os.path.abspath(os.path.dirname(os.path.abspath(os.path.dirname(__file__)))))
from selenium import webdriver
from selenium.webdriver.support.wait import WebDriverWait
from selenium.webdriver import ActionChains#PIL图片保存为base64编码
def PIL_base64(img, coding='utf-8'):img_format = img.formatif img_format == None:img_format = 'JPEG'format_str = 'JPEG'if 'png' == img_format.lower():format_str = 'PNG'if 'gif' == img_format.lower():format_str = 'gif'if img.mode == "P":img = img.convert('RGB')if img.mode == "RGBA":format_str = 'PNG'img_format = 'PNG'output_buffer = BytesIO()# img.save(output_buffer, format=format_str)img.save(output_buffer, quality=100, format=format_str)byte_data = output_buffer.getvalue()base64_str = 'data:image/' + img_format.lower() + ';base64,' + base64.b64encode(byte_data).decode(coding)return base64_str# 根据链接下载旋转图片
def get_img(url):header = {"Host": "passport.baidu.com","User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:93.0) Gecko/20100101 Firefox/93.0","Accept": "image/avif,image/webp,*/*","Accept-Language": "zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2","Accept-Encoding": "gzip, deflate, br","Referer": "https://wappass.baidu.com/","Connection": "keep-alive","Cookie": 'Hm_lvt_3eecc7feff77952670b7c24e952e8773=1666849322,1666919008,1666961940,1667175865; Hm_lpvt_3eecc7feff77952670b7c24e952e8773=1667186488; token="MTY2NzE4NzczNS4yMTEzMjg1OmQwNDNhNmZiZTA4MjlmOGY1YjE0MjA0NmViN2M1NTdkM2MyYWY3NzE="; sessionid=aa6zibdmfbs5cwzh6x62niw7fbqe5pon',"Sec-Fetch-Dest": "image","Sec-Fetch-Mode": "no-cors","Sec-Fetch-Site": "same-site","Pragma": "no-cache","Cache-Control": "no-cache",}response = requests.get(url=url,headers=header)if response.status_code == 200:img = Image.open(BytesIO(response.content))# 将图片转换成base64字符串并返回return PIL_base64(img)# 识别
def shibie(base64_img):url = "http://www.detayun.cn/tool/verify_code_identify/"header = {"Host": "www.detayun.cn","User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:101.0) Gecko/20100101 Firefox/101.0","Accept": "application/json, text/javascript, */*; q=0.01","Accept-Language": "zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2","Referer": "http://www.detayun.cn/tool/verifyCodeIdentifyPage/?verify_idf_id=9","Content-Type": "application/x-www-form-urlencoded; charset=UTF-8","X-Requested-With": "XMLHttpRequest","Content-Length": "134652","Origin": "http://www.detayun.cn","Connection": "keep-alive","Cookie": 'Hm_lvt_3eecc7feff77952670b7c24e952e8773=1688628385,1688694584,1688743439,1688889515; _ga_CD35DZJ728=GS1.1.1677340409.5.1.1677340416.0.0.0; _ga=GA1.1.1572230966.1677226494; token="MTY4ODg5MzEwOC42MTI2NDk3OjY0ZTk0YWI1NTg3MWFmMDhkOTg3ZmIxZGQxMGIwYzIwZjBlNTRhODE="; sessionid=m8k9lxbpc3pzx2nbuylrj9llft7yqir6; Hm_lpvt_3eecc7feff77952670b7c24e952e8773=1688889515',"Pragma": "no-cache","Cache-Control": "no-cache",}data = {'verify_idf_id':'16','img_base64':base64_img,'words':'',}response = requests.post(url=url,headers=header,data=data)if response.json()['code'] == 401:print('请登录识别账号,更新代码中的Cookie。登录地址:http://www.detayun.cn/account/loginPage/')returnreturn int(str(response.json()['data']['res_str']).replace('顺时针旋转','').replace('度',''))if __name__ == '__main__':options = webdriver.ChromeOptions()driver = webdriver.Chrome(executable_path='.\webdriver\chromedriver.exe', options=options)# 访问百度首页driver.get('https://wappass.baidu.com/static/captcha/tuxing.html?&ak=c27bbc89afca0463650ac9bde68ebe06&backurl=https%3A%2F%2Fwww.baidu.com%2Fs%3Fcl%3D3%26tn%3Dbaidutop10%26fr%3Dtop1000%26wd%3D%25E6%25B6%2588%25E9%2598%25B2%25E6%2588%2598%25E5%25A3%25AB%25E8%25BF%259E%25E5%25A4%259C%25E7%25AD%2591%25E5%259D%259D%25E5%25BA%2594%25E5%25AF%25B9%25E6%25B4%25AA%25E5%25B3%25B0%25E8%25BF%2587%25E5%25A2%2583%26rsv_idx%3D2%26rsv_dl%3Dfyb_n_homepage%26hisfilter%3D1&logid=8309940529500911554&signature=4bce59041938b160b7c24423bde0b518&timestamp=1624535702')# 等待滑块出现WebDriverWait(driver, 10).until(lambda x: x.find_element_by_xpath('//div[@class="passMod_slide-btn "]'))yzm_button = driver.find_element_by_xpath('//div[@class="passMod_slide-btn "]')time.sleep(1)move_x = 100# 等待验证码出现WebDriverWait(driver, 10).until(lambda x: x.find_element_by_xpath('//img[@class="passMod_spin-background"]'))img_src = driver.find_element_by_xpath('//img[@class="passMod_spin-background"]').get_attribute('src')# 下载图片并转化为base64img_base64 = get_img(img_src)# 识别图片旋转角度move_x = shibie(img_base64)# 通过旋转角度 * 滑动系数 = 滑动距离move_x = move_x * 0.66# 开始滑动action = ActionChains(driver)action.click_and_hold(yzm_button).perform()  # 鼠标左键按下不放action.move_by_offset(move_x, 0).perform()action.release().perform()  # 释放鼠标time.sleep(2)# 第二次滑动# 等待滑块出现WebDriverWait(driver, 10).until(lambda x: x.find_element_by_xpath('//div[@class="passMod_slide-btn "]'))yzm_button = driver.find_element_by_xpath('//div[@class="passMod_slide-btn "]')time.sleep(1)move_x = 100# 等待验证码出现WebDriverWait(driver, 10).until(lambda x: x.find_element_by_xpath('//img[@class="passMod_spin-background"]'))img_src = driver.find_element_by_xpath('//img[@class="passMod_spin-background"]').get_attribute('src')# 下载图片并转化为base64img_base64 = get_img(img_src)# 识别图片旋转角度move_x = shibie(img_base64)# 通过旋转角度 * 滑动系数 = 滑动距离move_x = move_x * 0.66# 开始滑动action = ActionChains(driver)action.click_and_hold(yzm_button).perform()  # 鼠标左键按下不放action.move_by_offset(move_x, 0).perform()action.release().perform()  # 释放鼠标

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

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

相关文章

ubuntu RPM should not be used directly install RPM packages, use Alien instead!

ubuntu RPM should not be used directly install RPM packages, use Alien instead! 所以我们最好下载deb版本的安装包 安装 参考文章

多线程设计模式【线程安全、 Future 设计模式、Master-Worker 设计模式 】(一)-全面详解(学习总结---从入门到深化)

目录 Single Thread Execution 设计模式 线程安全 Future 设计模式 Master-Worker 设计模式 生产者消费者设计模式 定义不可变对象的策略 Single Thread Execution 设计模式 机场过安检 Single Thread Execution 模式是指在同一时刻只能有一个线程去访问共享资源&#xff…

Qt提取excel表单中数据

这是一个excel表单,目标是把其中的数据提取出来。 文章学习自:QT中将excel中的数据快速的读取出来显示在tablewidget中/将tablewidget中的数据快速的写入excel中_qt将excel表格中指定范围内容显示在界面中_Jessica_1409573408的博客-CSDN博客 程序如下&…

基于Javaweb实现ATM机系统开发实战(八)实时查询余额功能实现

老规矩,先看前端页面,把前端页面上没有的表达式都删掉: 创建servlet接受和处理请求: package com.atm.servlet;import com.atm.pojo.User; import com.atm.service.UserService; import com.atm.service.impl.UserServiceImpl;im…

Low-Light Image Enhancement via Stage-Transformer-Guided Network 论文阅读笔记

这是TCSVT 2023年的一篇暗图增强的论文 文章的核心思想是,暗图有多种降质因素,单一stage的model难以实现多降质因素的去除,因此需要一个multi-stage的model,文章中设置了4个stage。同时提出了用预设query向量来代表不同的降质因素…

Flink使用总结

本文主要是为Flink的java客户端使用和flink-sql使用的大致介绍&#xff0c;具体使用查看文档页面。 java client使用 文档 Apache Flink Documentation | Apache Flink 数据处理模型 maven依赖 <?xml version"1.0" encoding"UTF-8"?> <pro…

代价函数(Cost Function)

基本概念 代价函数也被称作平方误差函数&#xff0c;有时也被称为平方误差代价函数。我们之所以要求出误差的平方和&#xff0c;是因为误差平方代价函数&#xff0c;对于大多数问题&#xff0c;特别是回归问题&#xff0c;都是一个合理的选择。还有其他的代价函数也能很好地发挥…

微信小程序做登录密码显示隐藏效果 并解决安卓手机端隐藏密码时小黑点显示过大问题

在编辑器和苹果手机上面显示就是正常的大小&#xff0c;在安卓手机上面黑点就非常大&#xff0c;需要单独调 安卓手机显示比较大 wxml 注意&#xff1a;在html中的input是通过切换type的属性值来实现隐藏显示的 在微信小程序的input里面type没有password属性 是通过password属…

Linux开发工具之vim工具的使用介绍

目录 前言 1.vim的基本概念 命令模式(Normal mode) 插入模式(Insert mode) 末行模式(last line mode) 2.vim的基本操作 命令模式的命令集 移动光标 ​编辑 删除文字 复制 替换 撤销操作 更改 vim末行模式命令集 简单vim配置 总结 前言 大家好呀&#xff0c;许久…

数据结构 | 图的最短路径 Floyd算法

一、数据结构定义 typedef int VertexType; typedef int EdgeType;/*图*/ typedef struct {VertexType Vexs[SIZE]; //结点 EdgeType Edges[SIZE][SIZE]; //权值 int vexnum, arcnum; }MGraph;/*路径*/ typedef struct {int path[SIZE][SIZE];EdgeType length; }Path; 1.二维…

微服务 云原生:微服务相关技术简要概述

后端架构演进 单体架构 所谓单体架构&#xff0c;就是只有一台服务器&#xff0c;所有的系统、程序、服务、应用都安装在这一台服务器上。比如一个 bbs 系统&#xff0c;它用到的数据库&#xff0c;它需要存储的图片和文件等&#xff0c;统统都部署在同一台服务器上。 单体架…

白皮书案例解读|数字孪生与港口的结合会碰撞出什么样的火花呢?

以下案例来自于《数字孪生世界白皮书&#xff08;2023版&#xff09;》 领取方式&#xff1a;公众号「EasyV数字孪生」后台回复「白皮书」即可领取&#xff01; 嗨&#xff0c;我又出现啦&#xff5e;今天想和大家聊聊关于港口场景数字孪生技术的应用&#xff0c;欢迎大家踊跃…