Python+Selenium-20-图片验证码处理

2023-11-12

前言

有些注册页面会含有验证码,本篇描述在selenium中对验证码的处理实例

 

需求

打开万维易源注册页面:https://www.showapi.com/auth/reg  (这个是第三方api平台易源接口,后面验证码识别用的就是他的)

在注册页面中包含验证码的操作

 

需求分析

1)打开控制台,点击上方截图中的验证码图片,在network中会有一条请求信息(这里为获取验证码图片的请求)

2)浏览器直接打开(发现打开的图片验证码并不是我们在注册页面看到的,浏览器刷新一下,发现每次图片都是变化的不固定的,因此我们不能直接通过请求来获取这个验证码图片)

3) 那我们怎么将验证码图片保存下来呢?

解决办法:在注册页面将验证码图片的位置获取到,利用python中的pillow模块将图片切下后保存下来

 

代码第一部分(保存验证码图片)

1)使用PIL裁切图片需使用PIL引用Image模块(pip install pillow直接安装

2)Image.open(file)方法可以返回打开的图片

3)使用crop((x0,y0,x1,y1))方法可以对图片做裁切;依次为起始点的横坐标、起始点的纵坐标、距离原点的宽度、高度

3)查找到元素,通过element.location可以得到x0,y0;通过element.size计算得到x1,y1即可

# coding:utf-8
from selenium import webdriver
from PIL import Image

driver = webdriver.Chrome()
driver.get("https://www.showapi.com/auth/reg")
# 1.将注册页面截图保存,这里需要以png结尾,其他图片格式会有warning
driver.save_screenshot("img/scr_img.png")
# 2.定位到验证码图片元素
code_ele = driver.find_element_by_id("checkImg")
# 3.元素的位置,结果:{'y': 478, 'x': 565},为图片左上角的位置
print(code_ele.location)
# 4.元素的大小,结果:{'height': 37, 'width': 135}
print(code_ele.size)
# 5.得到将元素的具体位置
x0 = code_ele.location["x"]  # 565
y0 = code_ele.location["y"]   # 478
x1 = code_ele.size["width"] + x0
y1 = code_ele.size["height"] + y0
img = Image.open("img/scr_img.png")
image = img.crop((x0,y0,x1,y1))  # 左、上、右、下
image.save("img/code_img.png")  # 将验证码图片保存为code_img.png

打开img文件夹,验证码的图片被保存下来了 

 

识别验证码

1)首先想到使用到python中的pytesseract模块(安装以及简单使用教程),但是试了一下没有将验证码字符串打印出来,这个模块只适合没有干扰项,特别简单的验证码,然而在一般的项目中非常简单的这种是不存在的

2)一般关于验证码的处理会在测试过程中直接去掉,或者设置成万能验证码,如果一定要对验证码操作的话,为保证正常获取的话需要借助第三方平台,这种平台很多,他们会提供调用的接口,我们直接调用拿到结果就可以了,但是一般都是收费的,这里就做简单演示吧(我这里花了0.1元购买了试了一下,确实好用,哈哈)

 

3)查看一下关于python 语言的调用方式

(具体调用:https://www.showapi.com/apiGateway/view/apiCode=184&pointCode=4

4)首先下载SDK(下载下来是一个zip文件,解压后为一个py文件,直接copy到我们的项目中)

5)在我们读取验证码的py文件中直接调用

 ① 这里为copy的调用案例

from ShowapiRequest import ShowapiRequest

r = ShowapiRequest("http://route.showapi.com/184-4","my_appId","my_appSecret" )
r.addFilePara("image", "替换为你的文件")
r.addBodyPara("typeId", "34")
r.addBodyPara("convert_to_jpg", "0")
r.addBodyPara("needMorePrecise", "0")
res = r.post()
print(res.text) # 返回信息

②上方的my_appId,my_appSecret需要付费后在个人中心-我的应用查看

 

代码部分(完整)

# coding:utf-8
from selenium import webdriver
from PIL import Image
from ShowapiRequest import ShowapiRequest

driver = webdriver.Chrome()
driver.get("https://www.showapi.com/auth/reg")
# 1.将注册页面截图保存,这里需要以png结尾,其他图片格式会有warning
driver.save_screenshot("img/scr_img.png")
# 2.定位到验证码图片元素
code_ele = driver.find_element_by_id("checkImg")
# 3.元素的位置,结果:{'y': 478, 'x': 565},为图片左上角的位置
# print(code_ele.location)
# 4.元素的大小,结果:{'height': 37, 'width': 135}
# print(code_ele.size)
# 5.得到将元素的具体位置
x0 = code_ele.location["x"]  # 565
y0 = code_ele.location["y"]   # 478
x1 = code_ele.size["width"] + x0
y1 = code_ele.size["height"] + y0
img = Image.open("img/scr_img.png")
image = img.crop((x0,y0,x1,y1))  # 左、上、右、下
image.save("img/code_img.png")  # 将验证码图片保存为code_img.png
# 6.识别验证码
r = ShowapiRequest("http://route.showapi.com/184-4","103296","db501a2c5da647fa9a07d3b4xxxxxxxx" )
r.addBodyPara("img_base64", "")
r.addBodyPara("typeId", "30")
r.addBodyPara("convert_to_jpg", "0")
r.addFilePara("image", "img/code_img.png") # img/code_img.png为存放的图片文件
res = r.post()
code_text = res.json()["showapi_res_body"]["Result"]
print(code_text) # 打印返回结果

查看执行结果

打开img目录查看验证码图片(正确返回了验证码内容,之后就可以直接在验证码输入框输入啦)

 

至此,在selenium中对验证码的处理梳理完毕

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Python+Selenium-20-图片验证码处理 的相关文章

  • springboot过滤器和拦截器

    一 过滤器和拦截器的区别 1 过滤器和拦截器触发时机不一样 过滤器是在请求进入容器后 但请求进入servlet之前进行预处理的 请求结束返回也是 是在servlet处理完后 返回给前端之前 2 拦截器可以获取IOC容器中的各个bean 而过
  • Volatility3内存取证工具使用详解

    Volatility 介绍 Volatility是一款开源的内存取证分析工具 是一款开源内存取证框架 能够对导出的内存镜像进行分析 通过获取内核数据结构 使用插件获取内存的详细情况以及系统的运行状态 支持Windows Linux MaC
  • org.springframework.boot.autoconfigure.jdbc.DataSourceBuilder 找不到依赖包

    org springframework boot autoconfigure jdbc DataSourceBuilder 找不到依赖包 org springframework boot autoconfigure jdbc DataSou
  • PowerOJ2546: fork【C++ STL __gnu_cxx::rope】

    题目链接 我们可以这样定义一个可持久化数组 rope
  • MIPI TX控制器的设计

    MIPI接口在移动设备中被广泛应用 主要用于传输图像传感器 液晶显示器等外设的数据 以MIPI DPHY v1 2为例 它包含一个CLK lane和若干个DATA lane 可配置 每个lane的最高速率可达到2 5Gbps 对比SerDe
  • 向win7旗舰版U盘启动盘 添加usb3.0driver

    以前的主板usb采用的是ehci controller 仅支持usb2 0 而现在的主板一般采用xhci controller 同时支持usb2 0和usb3 0 win7的镜像安装包里面的驱动并没有xhci的驱动 所以在如今的很多新平台的
  • 怎么样对阿里云ECS主机进行绑定域名

    首先我有个阿里的 域名 虚拟云主机 搭建了一个wordpress 的网站 地址为 www liuxun name wordpress liuxun name wordpress 现在我想把一个阿里云的ECS主机 里面装了tomcat 希望以
  • GET请求里的body问题

    故事还得从一个bug说起 今天有人问我 为什么发到后端的请求400了 我说肯定是参数不对 你去检查检查GET POST之类的方法写没写对 要么就是字段没对上 无非是这几个问题 然后他说检查过了 没问题啊 我不太相信 但是看了看前端发送的请求
  • springmvc 03(JSR303和拦截器)

    目录 一 JSR303 1 服务端验证 2 步骤 二 拦截器 1 简介 2 拦截器与过滤器 2 1 什么是过滤器 2 2 拦截器和过滤器的区别 3 拦截器案例 3 1 使用原理 一 JSR303 1 服务端验证 2 步骤 1 导入pom x
  • 【数据结构】6.5 红黑树(C++)

    数据结构 6 5 红黑树 没有学过二叉搜索树 也叫二叉排序树或二叉查找树 的小伙伴们建议先学习一下 这样阅读会更轻松哦 点我学习二叉搜索树 目录 一 红黑树的概念和性质 二 红黑树的存储结构和声明 三 红黑树的构建过程 四 红黑树的实现 1
  • Windows7上使用VS2013编译Caffe源码(不带GPU支持)步骤

    1 从https github com BVLC caffe 通过git clone下载caffe源码 master分支 版本号为09868ac git clone https github com BVLC caffe git 2 先使用
  • Visio画出简单的拓扑图

    1 选择类别 类别 网络 基本网络图 2 画图 在左边选择 模具 上方选择 连接线

随机推荐

  • Ubuntu下编译并运行C++代码

    安装完Ubuntu后 用户目录有时候也叫 home 文件夹或者主文件夹 它的路径是 home username 其中 username 就是我们登录 Linux 时使用的用户名 Linux 会在 home 目录下为每一个登录的用户创建一个文
  • Java中泛型

    Thinking in Java 第15章笔记 即使使用了接口 就要求代码必须使用特定的接口 对程序的约束也还是太强了 我们希望达到的目的是编写更通用的代码 要使代码能够应用与 某种不具体的类型 而不是一个具体的接口或类 泛型这个术语的意思
  • 2023-05-30 题目

    一 LinkedList 1 特点 线程不安全 底层是链表 删除 插入数据快 查询速度较慢 如果想让其变成线程安全的 可以使用Collections synchronizedList 方法 链表底层结构 2 源码如下 Pointer to
  • 电磁兼容按GB4824-2019分类,为1组A类和2组A类,是如何区分?

    电磁兼容按GB4824 2019分类 为1组A类和2组A类 是如何区分 摘要 电磁兼容按GB4824 2019分类 为1组A类和2组A类 是如何区分 GB4824 2019分类 设备的分组与分类 分组 为了简化区分相关限值 本标准范围内的设
  • 请求分页系统中的置换算法(FIFO、LRU、Optimal)

    操作系统实验导航 实验一 银行家算法 https blog csdn net weixin 46291251 article details 115384510 实验二 多级队列调度和多级反馈队列调度算法 https blog csdn n
  • Spring Boot 使用WebSocket、SockJS、STOMP实现消息功能(三)

    一 介绍 这里主要基于上一篇介绍一下基于SocketJS Stomp来实现的的长连接 我借鉴了其他的一些博客 只是把我用的知识总结在了一起方便我自己以后回顾 二 WebSocket概念 概述 WebSocket协议提供了通过一个套接字实现全
  • 10年老技术人员:C++ 该如何快速入门?

    C 是一门面对对象的语言 我们如何学习呢 其实任何的难题都是多种简单的部分通过复杂的关系组合在一起 学语言 最关键的是理解而不是运用 高中的时候 老师给出的公式 都是告诉我们用就好了 不用去了解它怎么来的 但是语言不一样 你如果只会用那你是
  • UnityEditor-批处理Texture,spriteEditor,代码设置Pivot失效问题

    需求起因 最近制作角色2D八方向的动画 美术提供的序列帧图片资源 角色不同动作不同方向的图片大小和角色实际的中心点是不一致的 如图所示 攻击和溃败的序列帧图片尺寸和角色在图片中心位置是不一样的 这样会导致一个问题 在动画状态切换的时候 犹豫
  • R-CNN网络基础

    目录 R CNN网络基础 Overfeat模型 RCNN模型 算法流程 候选区域生成 CNN网络提取特征 目标分类 SVM 目标定位 预测过程 算法总结 Fast RCNN模型 算法流程 ROI Pooling 目标分类和回归 模型训练 模
  • java发送邮件报SSL安全异常解决

    用公司阿里云企业邮箱发送邮件 一直报javax net ssl SSLHandshakeException PKIX path building failed sun security provider 异常 顾名思义是安全验证问题 以下是
  • R语言-地图绘制的思路

    R中的画地图的思路有三种 一种是利用包里GIS方面的数据 在R中直接画出来 第二种是从其他地方拿到数据 在R中通过某些包解析后再展现成 第三种就是直接把别人的图拿过来 自己再添加或去掉自己需要或不需要的东西 这三种方法只是数据来源不同 具体
  • BGP实验--联邦以及反射器

    实验明细 实验拓扑 实验要求 实验内容 实验拓扑 实验要求 1 R2 R7每台路由器均存在一个环回接口用于建立邻居 同时还存在一个环回来代表连接用户的接口 最终这些连接用户的接口网络需要可以和R1 8的环回通讯 2 AS2网段地址为172
  • 【C语言】扫雷小游戏的实现(爆炸展开)

    需要云服务器等云产品来学习Linux的同学可以移步 gt 腾讯云 lt gt 阿里云 lt gt 华为云 lt 官网 轻量型云服务器低至112元 年 新用户首次下单享超低折扣 各位朋友们大家好呀 今天又又是游戏整活环节 先介绍一下这个版本的
  • 【JavaScript】运算符及其优先级

    目录 一 算术运算符 1 常用的算术运算符 2 算术运算符的注意事项 二 递增和递减运算符 1 前置递增 递减 运算符 2 后置递增 递减 运算符 3 前缀和后缀的区别 三 比较运算符 关系运算符 四 逻辑运算符 1 运算中的短路现象 2
  • MATLAB车牌识别技术实现

    目 录 一 课程设计任务11 二 课程设计原理及设计方案22 1 系统简述22 2 图像预处理33 2 1灰度变换33 2 2边缘提取44 3 车牌定位55 4 字符分割55 5 字符识别66 三 课程设计的步骤和结果88 四 设计总结22
  • 关于深度学习中concat和eltwise两种特征融合方式用处的猜想

    在对网络不同地方的特征进行融合时 尤其是在深层网络融合浅层网络的特征的时候我们需要用到这两种融合方式 这两者的使用有有什么区别吗 在实际中 直接使用eltwise将当前的深层特征与浅层的特征融合时效果并不好 应该在eltwise前加若干层网
  • jmeter基本使用

    1 测试工具 jmeter压力测试相关工具 1 apache jmeter 3 1 2 JMeterPlugins Standard 1 4 0 JMeterPlugins Extras 1 4 0 3 ServrerAgent 2 2 1
  • windows azure系统简介

    Windows Azure Storage 云存储系统 提供给用户 貌似无限容量的数据存储 貌似可保存任意长的时间 数据按副本存放 本地副本 容忍设备故障 广域副本 容忍地域灾难 强一致性 待看 Azure存储系统的元素包括三种 Blobs
  • 随机抽奖程序(每天一个python小项目)

    import random num 用于存放抽奖码 print 欢迎来到抽奖小程序 while True usernum input 请输入参与抽奖的人数 reward input 请输入中奖人数 if usernum isdigit Tr
  • Python+Selenium-20-图片验证码处理

    前言 有些注册页面会含有验证码 本篇描述在selenium中对验证码的处理实例 需求 打开万维易源注册页面 https www showapi com auth reg 这个是第三方api平台易源接口 后面验证码识别用的就是他的 在注册页面