爬虫进阶教程:极验(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:

目前评论:31   其中:访客  17   博主  14

    • avatar 阿飞 来自天朝的朋友 谷歌浏览器 Windows 10 上海市 移动 0

      大佬,我现在正想爬这个国家企业信用信息公示平台的信息,但是它的验证码方式变了,变成依次点击汉字的形式,请问如何破解此类验证码,非常感谢!!

        • avatar Jack Cui Admin 来自天朝的朋友 谷歌浏览器 Windows 10 辽宁省沈阳市 联通

          @阿飞 已经升级了啊。那个没有研究过,你可以github搜下,看下有开源的吗。如果是这样的,那应该得用深度学习的方法解决了。

          • avatar 你好 来自天朝的朋友 谷歌浏览器 Windows 7 上海市 电信 1

            @阿飞 解决了吗亲

              • avatar Jack Cui Admin 来自天朝的朋友 谷歌浏览器 Windows 10 辽宁省沈阳市 联通

                @你好 一直没有再弄。

                  • avatar 你好 来自天朝的朋友 谷歌浏览器 Windows 7 上海市 电信 1

                    @Jack Cui 好的

              • avatar 小勇 来自天朝的朋友 谷歌浏览器 Windows 7 黑龙江省 移动 3

                从这个链接,我去csdn看你的教程呢,我想问下,用Tkinter生成完gui应该还是.py文件吧,如何打包成exe文件?谢谢

                  • avatar Jack Cui Admin 来自天朝的朋友 谷歌浏览器 Windows 10 北京市 百度网讯科技联通节点

                    @小勇 pyinstaller即可。

                      • avatar 小勇 来自天朝的朋友 谷歌浏览器 Windows 10 黑龙江省 电信 3

                        @Jack Cui 收到,谢谢,最近https://github.com/Avik-Jain/100-Days-Of-ML-Code这个挺火的,就是每天1小时,从基础学习机器学习。对我这小白来说还是有点难。不知道对你还有帮助没,你可以看看

                          • avatar Jack Cui Admin 来自天朝的朋友 谷歌浏览器 Windows 10 北京市 百度网讯科技联通节点

                            @小勇 嗯,现在已经没有机会那么系统学了。

                          • avatar 小勇 来自天朝的朋友 谷歌浏览器 Windows 10 黑龙江省 电信 3

                            @Jack Cui 还有个问题再麻烦一下,csdn教程中视频播放那个,会调用起来系统默认的浏览器,这个是用的哪个操作??我昨天尝试调用chrom浏览器,提示我是没有对应驱动。我想问下,你用的什么方法,可以调用起来用户浏览器,而用户不用必须有驱动,谢谢

                              • avatar Jack Cui Admin 来自天朝的朋友 谷歌浏览器 Windows 10 北京市 百度网讯科技联通节点

                                @小勇 这个没有办法,必须得有驱动,打包的时候,把驱动也打包进去即可。

                                  • avatar 小勇 来自天朝的朋友 谷歌浏览器 Windows 10 黑龙江省 电信 3

                                    @Jack Cui 收到,谢谢,以为你就简单方法,能够规避呢,多谢了

                            • avatar 小勇 来自天朝的朋友 谷歌浏览器 Windows 10 黑龙江省 电信 3

                              你这个selenium打开网页怎么不提示什么自动化测试模式呢,我的谷歌浏览器,每次用selenium启动网页,都在上面有一条提示恒在,显示是在什么自动化模式下。怎么关闭?谢谢

                                • avatar Jack Cui Admin 来自天朝的朋友 火狐浏览器 Windows 7 北京市 百度网讯科技联通节点

                                  @小勇 没法去掉,除非你自己编译驱动,改源码。

                                  • avatar 小勇 来自天朝的朋友 谷歌浏览器 Windows 10 黑龙江省 电信 3

                                    @小勇 大概就是浏览器写着chrom正受自动化软件的控制,我看你这个文章截图里,并没有这样,为何?谢谢

                                      • avatar Jack Cui Admin 来自天朝的朋友 火狐浏览器 Windows 7 北京市 百度网讯科技联通节点

                                        @小勇 我的也是有的啊。

                                    • avatar 小勇 来自天朝的朋友 谷歌浏览器 Windows 7 黑龙江省 移动 3

                                      寻求帮助,处理这个页面时,我采用的是geetest官网的用例,有几个点不太一样,我有点走不下去了,我把详细过程发到你的github的issue了,你有时间时候帮忙看下呗,里面的txt是我记录的详细抓包过程。感谢

                                        • avatar 小勇 来自天朝的朋友 谷歌浏览器 Windows 7 黑龙江省 移动 3

                                          @小勇 没事,我好像慢慢扒出来点了,这条删不掉了,你不用理会了,谢谢

                                            • avatar Jack Cui Admin 来自天朝的朋友 谷歌浏览器 Windows 10 北京市 百度网讯科技联通节点

                                              @小勇 666666可以在issue分享下哈~

                                                • avatar 小勇 来自天朝的朋友 谷歌浏览器 Windows 10 黑龙江省 电信 3

                                                  @Jack Cui 我提了一个issue给你,但让我自己关闭了。东西还在里面。他是自己的页面有2个js和css,点击以后会先加载这两个,然后会将图片重新排序,显示成正常样子。暂时还不懂js和css所以我还不能恢复成正常图片。得慢慢处理了。有点难啊。。你要是有时间,可以看看我提交给你的issue,被我关闭了,但东西还在。https://github.com/Jack-Cherish/python-spider/issues/49,里面的先访问的js和css,都是当前页面的。

                                                    • avatar Jack Cui Admin 来自天朝的朋友 谷歌浏览器 Windows 10 北京市 百度网讯科技联通节点

                                                      @小勇 好的,等我有时间,我看下。我先把issue打开。