爬虫进阶教程:极验(GEETEST)验证码破解教程

  • A+
所属分类:网络爬虫
摘要

爬虫最大的敌人之一是什么?没错,验证码!Geetest作为提供验证码服务的行家,市场占有率还是蛮高的。遇到Geetest提供的滑动验证码怎么破?授人予鱼不如授人予渔,接下来就为大家呈现本教程的精彩内容。

爬虫进阶教程:极验(GEETEST)验证码破解教程

一、前言

爬虫最大的敌人之一是什么?没错,验证码!Geetest作为提供验证码服务的行家,市场占有率还是蛮高的。遇到Geetest提供的滑动验证码怎么破?

一种方法是分析它的js加密方法,通过大量抓包分析找到它的返回参数,直接自动生成需要的参数即可,这种方法工程量大一些,并且官方js脚本一升级,就得重新分析,耗时耗力。

今天为大家介绍的一种方法是,通过Selenium模拟用户滑动解锁。这个方法的优势在于简单,方便更新。但是它的缺点也很明显,速度慢,并且不能制作成api接口的形式。

授人予鱼不如授人予渔,接下来就为大家呈现本教程的精彩内容。不过,在阅读本篇文章之前,请确保你已经掌握网络爬虫基础,如果不具备爬虫基础,请到我的CSDN专栏学习。然后,再来阅读本文,我的专栏地址:点我查看

二、先睹为快

爬虫进阶教程:极验(GEETEST)验证码破解教程

左侧显示的为自动识别过程,右边是一些打印信息。

三、实战分析

我们以国家企业信用信息公式系统为例,这是一个企业信息查询的网站,在每次查询都需要进行一次验证码识别。它所使用的就是GEETEST验证码,它的URL:点我查看

这个网站是这个样子的:

爬虫进阶教程:极验(GEETEST)验证码破解教程

1、过程分析

要想把大象装冰箱,总共分几步?

  • 把冰箱门打开
  • 把大象赛冰箱里
  • 把冰箱门关上

那么,现在思考一个问题,通过Selenium模拟用户滑动解锁,总共分几步?请停在这里,思考五分钟,再继续阅读!

我们先公布一个粗率的答案:

  • 使用Selenium打开页面。
  • 匹配到输入框,输入要查询的信息,并点击查询按钮。
  • 读取验证码图片,并做缺口识别。
  • 根据缺口位置,计算滑动距离。
  • 根据滑动距离,拖拽滑块到需要匹配的位置。

其实,将每个步骤拆分开来一点一点实现并不难,接下来进入正文。

2、实战开始

第一步:使用Selenium打开网页,并输入信息,点击查询按钮。

这部分内容很简单,Selenium基础性的东西我不再讲解,如有不懂,请看我专栏的Selenium相关内容。

编写代码如下:

运行效果如下:

爬虫进阶教程:极验(GEETEST)验证码破解教程

第二步:保存验证码图片

我们审查元素找打图片的地址,审查结果如下:

爬虫进阶教程:极验(GEETEST)验证码破解教程

可以看到,图片是很多图片合成的,也就是说你只保存所有地址的图片是不行的。它是通过background-position的方法进行合成的。每一个图片是乱的,这个怎么搞?很简单,抓取这些图片的链接,然后根据链接的图片,再合成这张没有缺口的图片,获取缺口图的方法也是如此,都是自己合成。

编写代码如下:

运行效果如下:

爬虫进阶教程:极验(GEETEST)验证码破解教程

可以看到,运行之后,我们已经顺利生成了两张图片,一个是缺口图,另一个是非缺口图。

第三步:计算缺口距离

根据缺口图和非缺口图,通过比对图像的像素点的大小区别,找到缺口位置。

编写代码如下:

运行结果如下:

爬虫进阶教程:极验(GEETEST)验证码破解教程

这样我们就计算除了缺口位置,接下来就是根据缺口位置,滑动滑块到相应位置。

第四步:计算滑动轨迹

我们可以使用瞬间移动,直接在1s内移动到目标位置,结果就是”被吃了“。

爬虫进阶教程:极验(GEETEST)验证码破解教程

匀速直线运动,匀速直线运动大法好!果不其然,还是”被吃了“,继续尝试。

爬虫进阶教程:极验(GEETEST)验证码破解教程

模仿抖抖病患者运动,颤颤巍巍,如履薄冰,估计geetest服务器认为是我外婆在操作吧。

爬虫进阶教程:极验(GEETEST)验证码破解教程

虽然这个方法偶尔会成功,但成功率极低。最好的方法是什么呢?

模拟人的运动!你想一下,人在滑动滑块的初期是不是速度快,但是当要接近缺口位置的时候,会减速,因为我得对准缺口位置啊!这怎么实现呢?使用我们初中学过的物理知识:

当前速度公式为:

v = v0 + a * t

其中,v是当前速度,v0是初始速度,a是加速度,t是时间。我们刚开始的让加速大,当过了中间位置,降低加速度。使用这个移动过程,移动滑块到缺口位置。

编写代码如下:

运行效果如下:

爬虫进阶教程:极验(GEETEST)验证码破解教程

第五步:移动滑块

根据返回的每次滑动的距离,我们移动滑块至缺口位置。

编写代码如下:

运行上述代码,即实现滑动验证码破解,再看下那个nice的瞬间吧。

爬虫进阶教程:极验(GEETEST)验证码破解教程

五、总结

  • 本文抛去了很多具体的实现过程,省略了每行代码的讲解,因为我感觉,既然是进阶教程,那些初级知识就没必要再细讲,学我的初级课程的朋友,应该已经具备了自己分析的能力。
  • 本文的破解方法仅用于学习交流,请勿用于任何非法用途。
  • 本文出现的所有代码和,均可在我的github上下载,欢迎Follow、Star:https://github.com/Jack-Cherish/python-spider
  • 如有问题欢迎留言讨论!

 

PS: 如果觉得本篇本章对您有所帮助,欢迎关注、评论、赞!

Jack Cui

发表评论

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

目前评论:39   其中:访客  21   博主  18

    • avatar 土卫二 来自天朝的朋友 谷歌浏览器 Windows 10 江苏省苏州市 电信 4

      大佬 1:threshold = 60是什么意思,为什么三个点的差值都要小于60 才算判断像素是相同
      2:怎么知道缺块的宽度是43的(left = 43)

        • avatar Jack Cui Admin 来自天朝的朋友 谷歌浏览器 Windows 7 辽宁省沈阳市 东北大学三舍南(研究生)

          @土卫二 这个阈值是测试得到的,属于超参数。
          宽度这里是通过比对拼接后的图片得到的。

        • avatar haocker 来自天朝的朋友 谷歌浏览器 Windows 7 四川省德阳市 联通 0

          我通常是分析js,然后用算法计算出结果,然后提交给极验获取验证码,用无头浏览器感觉有点慢

            • avatar Jack Cui Admin 来自天朝的朋友 谷歌浏览器  Android 8.0.0 MIX 2 Build/OPR1.170623.027 辽宁省沈阳市 联通GSM/WCDMA/LTE共用出口

              @haocker 嗯,给第三方平台是最方便的方式。