爬虫教程 – OpenCV 图像匹配识别滑动验证码缺口

  • Post author:
  • Post category:其他


  1. 滑动验证码

说到滑动验证码,有代表性的服务提供商有极端验证、网易盾等。验证码效果如图所示:

极验

网易易盾

验证码下方通常会有一个滑轨,同时带有文字提示「拖动滑块完成拼图」,我们需要按滑轨上的滑块向右拖动。此时,验证码左侧的滑块将跟随滑轨上的滑块向右移动。验证码右侧将有滑块间隙。我们需要将滑块拖到目标间隙。此时,即使验证成功,验证成功的效果如图所示:

因此,如果我们想用爬虫自动化这个过程,关键步骤如下:

识别目标间隙的位置

将缺口滑动到对应位置

实现第二步的方法有很多,比如我们可以用 Selenium 当自动化工具模拟完成流程后,验证并登录成功 Cookies 或 Token 后续操作等信息,但这种方法效率会比较低。另一种方法是直接逆向验证码背后 JavaScript 逻辑,直接传递缺口信息 JavaScript 获取一些类似的代码执行 “密钥” 再利用这些信息 “密钥” 下一步操作。

注:由于某些安全原因,本书不会介绍第二步的具体操作,而只解释第一步的技术问题。

因此,本节只介绍了第一步,即如何识别目标间隙的位置,即给出验证码图片,以及如何通过图像识别来识别间隙的位置。

  1. 基本原理

本节将介绍使用情况 OpenCV 识别缺口的方法,输入带有缺口的验证码图片,输出缺口的位置(通常是缺口左侧的横坐标)。

例如,输入的验证码图片如下:

captcha

最终输出的识别结果如下:

本节介绍的方法是使用 OpenCV 实现基本图像处理的主要步骤包括:

高斯模糊滤波处理验证码图片,消除部分噪声干扰

通过调整相应阈值来识别验证码图片的边缘检测算法

通过对比面积、位置、周长等特征,筛选出上一步获得的每个边缘轮廓信息,以获得最可能的轮廓位置。

  1. 准备工作

请确保本节开始前已安装。 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/ 自行截取,如上图所示。

  1. 基础知识

在真正开始介绍之前,我们首先需要了解一些 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:指定用于查找梯度幅度的等式。



版权声明:本文为D0126_原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。