Python3网络爬虫课程8.2极验滑动验证码的识别

上一节了解了简单验证码的识别,但是现在这种验证码非常少见,现在出现了一大批新型的验证码,如极验滑动验证码,它需要拖动合并滑块才能完成识别。

目标

本节目标是识别极验滑动验证码,如分析思路、识别缺口、生成拖动路径、模拟合并等。

准备

需要安装 Python 的 selenium 库,需要安装 Chrome 浏览器并配置好驱动 ChromeDriver。请参考第一节第二节的内容。

识别

我们使用浏览器模拟的方式来识别验证码,然后我们拖动滑块,使滑块和图片缺口对齐,则通过验证。

思路

归纳一下,识别大概分为三步:

模拟点击验证按钮

识别图片缺口位置

拖动滑块 第一步操作很简单,我们可以直接使用 selenium 模拟点击。 第二步识别缺口的位置很关键,需要使用到图像处理相关的方法。我们观察图片,缺口的四周有明显的断裂痕迹,边缘和边缘周围有明显的区别。可以实现一个边缘检测算法来寻找缺口的位置,对于极验滑动验证码来说,可以利用和原图对比的方式来识别缺口的位置,点击验证按钮,未拖动滑块时图片是完成的,当拖动图片时才会显示缺口,我们可以获取这两张图片,设定一个阈值,遍历图片,找出两张图片相同位置像素 RGB 差距超过此阈值的像素点,那么这个像素点就是缺口的位置。

第三步操作看似简单,但实际坑很多。极验滑动验证码增加了机器轨迹识别、匀速移动、随机速度移动等方式,这些方式都不能通过验证,只有完全模拟人的移动轨迹才可以通过识别。人的移动轨迹一般时先加速后减速,我们要模拟这个过程。

初始化

这里首先做一些初始化的配置。

模拟点击

实现第一步操作,即模拟点击,我们定义一个方法来获取这个按钮。

随后我们调用 click()方法点击这个按钮即可。

识别缺口

获取不带缺口图片

我们先获取不带缺口的位置,利用 selenium 获取图片元素,得到其所在位置、宽高等,然后获取网页的截图,裁剪图片。

获取网页截图

获取验证码图片的位置

获取带缺口的图片

首先获取滑块

利用 get_slider()方法获取到滑块对象,然后点击 clikc()方法,缺口图片即可呈现。

调用 get_geetest_image()方法获取带缺口图片

获取缺口

我们遍历两张图片的每个坐标点,获取到两张图片对应像素点的 RGB 数值。如果二者的 RGB 数值差在一定范围内,那就代表两个像素相同,继续对比下一个像素,如果差距超过一定范围,则当前位置即为缺口位置。

is_pixel_equal()方法用于判断两张图片同一位置的像素是否相同,get_gap()方法用于获取缺口位置。

模拟拖动

模拟拖动过程不复杂,但坑很多,匀速移动极验滑动会识别出他是程序的操作,因为人是无法做到匀速移动的,极验滑动使用机器学习模型来识别是否为机器操作。 我们尝试模拟加速减速过程来进行验证,前段滑块做匀加速运动,后段做匀减速运动。

我们尝试定义 get_track()方法,传入移动总距离,返回移动轨迹

最后,我们按照移动轨迹来拖动滑块。