说到滑动验证码,有代表性的服务提供商有极端验证、网易盾等。验证码效果如图所示:
极验
网易易盾
验证码下方通常会有一个滑轨,同时带有文字提示「拖动滑块完成拼图」,我们需要按滑轨上的滑块向右拖动。此时,验证码左侧的滑块将跟随滑轨上的滑块向右移动。验证码右侧将有滑块间隙。我们需要将滑块拖到目标间隙。此时,即使验证成功,验证成功的效果如图所示:
因此,如果我们想用爬虫自动化这个过程,关键步骤如下:
识别目标间隙的位置
将缺口滑动到对应位置
实现第二步的方法有很多,比如我们可以用 Selenium 当自动化工具模拟完成流程后,验证并登录成功 Cookies 或 Token 后续操作等信息,但这种方法效率会比较低。另一种方法是直接逆向验证码背后 JavaScript 逻辑,直接传递缺口信息 JavaScript 获取一些类似的代码执行 “密钥” 再利用这些信息 “密钥” 下一步操作。
注:由于某些安全原因,本书不会介绍第二步的具体操作,而只解释第一步的技术问题。
因此,本节只介绍了第一步,即如何识别目标间隙的位置,即给出验证码图片,以及如何通过图像识别来识别间隙的位置。
本节将介绍使用情况 OpenCV 识别缺口的方法,输入带有缺口的验证码图片,输出缺口的位置(通常是缺口左侧的横坐标)。
例如,输入的验证码图片如下:
captcha
最终输出的识别结果如下:
本节介绍的方法是使用 OpenCV 实现基本图像处理的主要步骤包括:
高斯模糊滤波处理验证码图片,消除部分噪声干扰
通过调整相应阈值来识别验证码图片的边缘检测算法
通过对比面积、位置、周长等特征,筛选出上一步获得的每个边缘轮廓信息,以获得最可能的轮廓位置。
请确保本节开始前已安装。 python-opencv 安装方式如下:
pip3 install python-opencv
如有安装问题,请参考详细的安装步骤:https://setup.scrape.center/python-opencv。
另外,建议提前准备滑动验证码图片,样例图片下载地址:https://github.com/Python3WebSpider/CrackSlideCaptcha/blob/cv/captcha.png,当然也可以 https://captcha1.scrape.center/ 自行截取,如上图所示。
在真正开始介绍之前,我们首先需要了解一些 OpenCV 的基础 API,帮助我们更好地理解整个原则。
高斯滤波
高斯滤波器用于去除图像中的一些噪声。事实上,基本效果是模糊图像,减少一些图像噪声干扰,为下一次边缘检测铺平道路。
OpenCV 提供了一个用于实现高斯模糊的方法,叫做 GaussianBlur,方法声明如下:
def GaussianBlur(src, ksize, sigmaX, dst=None, sigmaY=None, borderType=None)
重要参数介绍如下:
src:即需要处理的图像。
ksize:用于高斯滤波处理的高斯内核大小需要一个元组,包括 x 和 y 两个维度。
sigmaX:表示高斯核函数在 X 标准偏差的方向。
sigmaY:表示高斯核函数在 Y 如果方向的标准偏差, sigmaY 为 把它设定为0 sigmaX,如果 sigmaX 和 sigmaY 都是 0,那么 sigmaX 和 sigmaY 就通过 ksize 计算得出。
这里 ksize 和 sigmaX 本节样例图片为必传参数,ksize 我们可以取 (5, 5),sigmaX 可以取 0。
高斯滤波处理后,图像变得模糊,效果如下:
边缘检测
由于验证码的目标缺口通常有明显的边缘,可以通过一些边缘检测算法和调整阈值来找到其位置。边缘检测算法目前应用广泛 Canny,它是 John F. Canny 于 1986 年开发的多级边缘检测算法效果良好,OpenCV 这个算法也实现了,方法名称叫做 Canny,声明如下:
def Canny(image, threshold1, threshold2, edges=None, apertureSize=None, L2gradient=None)
重要参数介绍如下:
image:即需要处理的图像。
threshold1、threshold2:两个阈值,分别为最小和最大判定临界点。
apertureSize:用于查找图像渐变 Sobel 核心的大小。
L2gradient:指定用于查找梯度幅度的等式。