Python 爬虫实战:利用 OpenCV 识别并破解滑动验证码
使用 Python 爬虫破解滑动验证码的技术方案。主要步骤包括安装 OpenCV 等依赖库,对验证码图片进行高斯模糊去噪和 Canny 边缘检测以提取轮廓,利用模板匹配或轮廓分析计算滑块缺口偏移距离,最后通过 Selenium 或 HTTP 请求模拟拖动行为。文章提供了完整的代码示例及常见问题的优化建议,旨在帮助开发者掌握图形验证码的识别与绕过原理。

使用 Python 爬虫破解滑动验证码的技术方案。主要步骤包括安装 OpenCV 等依赖库,对验证码图片进行高斯模糊去噪和 Canny 边缘检测以提取轮廓,利用模板匹配或轮廓分析计算滑块缺口偏移距离,最后通过 Selenium 或 HTTP 请求模拟拖动行为。文章提供了完整的代码示例及常见问题的优化建议,旨在帮助开发者掌握图形验证码的识别与绕过原理。

在使用 Python 爬虫抓取数据时,经常会遇到网站为了防止机器人登录而设置的各种验证机制。除了最基本的字符验证码之外,滑块验证、图片顺序验证等图形验证码也日益普及。本文将详细介绍如何使用 Python 结合 OpenCV 库来识别并破解常见的滑块验证码。
在开始之前,需要安装必要的 Python 库。主要依赖 opencv-python 进行图像处理,以及 Pillow 用于图像操作。如果涉及浏览器自动化,还需要 selenium。
pip install opencv-python pillow selenium
滑块验证码的破解核心在于定位缺口的位置。通常流程包括:读取图片、预处理(去噪)、边缘检测、轮廓查找、坐标计算以及模拟拖动。
首先需要加载目标滑块图片和背景图。这里假设我们已经获取到了这两张图片的路径。
import cv2 as cv
import numpy as np
def load_images(bg_path, gap_path):
# 读取背景图和缺口图
bg = cv.imread(bg_path)
gap = cv.imread(gap_path)
return bg, gap
为了减少图像噪声对后续边缘检测的影响,通常会对图像进行高斯模糊处理。这有助于平滑图像细节,突出主要轮廓。
def gaussian_blur(image):
# (5, 5) 是核大小,0 表示根据核大小自动计算标准差
blurred = cv.GaussianBlur(image, (5, 5), 0)
return blurred
互联网上的验证码图片大多使用 RGB 格式。使用 Canny 算子可以将图像转换为二值图像(黑白图),从而清晰地分离出滑块和缺口的边缘。
def edge_detection(image):
# 阈值参数可根据实际图片调整,通常第一个值较小,第二个值较大
canny = cv.Canny(image, 200, 400)
return canny
获得二值图像后,我们需要找到滑块的轮廓。通过遍历轮廓并计算边界矩形,可以确定缺口相对于背景的位置。注意,OpenCV 4.x 版本中 findContours 返回两个值。
def find_gap_position(bg_canny, gap_canny):
# 查找背景图中的轮廓
contours_bg, _ = cv.findContours(bg_canny, cv.RETR_EXTERNAL, cv.CHAIN_APPROX_SIMPLE)
# 查找缺口图的轮廓
contours_gap, _ = cv.findContours(gap_canny, cv.RETR_EXTERNAL, cv.CHAIN_APPROX_SIMPLE)
# 这里简化逻辑:通常寻找最大的轮廓作为滑块主体
# 在实际应用中,可能需要对比两张图的差异来确定偏移量
# 此处演示如何获取边界框
if contours_bg:
x, y, w, h = cv.boundingRect(max(contours_bg, key=cv.contourArea))
return x, y, w, h
return 0, 0, 0, 0
更精确的定位方法: 通常的做法是将缺口图叠加到背景图上,通过模板匹配或像素差异法来计算偏移距离。以下是一个基于像素差异的简化示例:
def calculate_offset(bg_img, gap_img):
# 将图片转为灰度以便比较
gray_bg = cv.cvtColor(bg_img, cv.COLOR_BGR2GRAY)
gray_gap = cv.cvtColor(gap_img, cv.COLOR_BGR2GRAY)
# 在背景图中搜索缺口位置
res = cv.matchTemplate(gray_bg, gray_gap, cv.TM_CCOEFF_NORMED)
min_val, max_val, min_loc, max_loc = cv.minMaxLoc(res)
# 返回匹配到的左上角坐标
return max_loc[0]
计算出偏移距离后,最后一步是模拟用户行为将滑块移动到正确位置。如果使用 Selenium 控制浏览器,可以通过 JavaScript 执行拖动事件;如果是直接请求接口,则需构造相应的 HTTP 请求参数。
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.action_chains import ActionChains
def drag_slider(driver, element_id, distance):
try:
slider = WebDriverWait(driver, 10).until(
EC.presence_of_element_located((By.ID, element_id))
)
actions = ActionChains(driver)
actions.click_and_hold(slider).perform()
# 移动滑块
actions.move_by_offset(distance, 0).perform()
# 松开鼠标
actions.release().perform()
print(f"成功拖动滑块,距离:{distance}")
except Exception as e:
print(f"拖动失败:{e}")
以下是整合后的基础脚本框架,展示了从图像识别到坐标计算的完整流程。
import cv2
import numpy as np
class SliderCracker:
def __init__(self, bg_path, gap_path):
self.bg_path = bg_path
self.gap_path = gap_path
self.bg_img = None
self.gap_img = None
def load(self):
self.bg_img = cv.imread(self.bg_path)
self.gap_img = cv.imread(self.gap_path)
if self.bg_img is None or self.gap_img is None:
raise ValueError("图片加载失败")
def process(self):
# 1. 预处理
bg_blur = cv.GaussianBlur(self.bg_img, (5, 5), 0)
gap_blur = cv.GaussianBlur(self.gap_img, (5, 5), 0)
# 2. 边缘检测
bg_edge = cv.Canny(bg_blur, 200, 400)
gap_edge = cv.Canny(gap_blur, 200, 400)
# 3. 模板匹配计算偏移
# 注意:实际场景中可能需要裁剪特定区域以提高精度
result = cv.matchTemplate(bg_edge, gap_edge, cv.TM_CCOEFF_NORMED)
_, max_val, _, max_loc = cv.minMaxLoc(result)
if max_val > 0.8: # 置信度阈值
return max_loc[0]
else:
return -1
# 使用示例
if __name__ == "__main__":
# 请替换为实际图片路径
cracker = SliderCracker("bg.png", "gap.png")
cracker.load()
offset = cracker.process()
print(f"计算出的偏移距离为:{offset} 像素")
本文介绍了使用 Python 和 OpenCV 破解滑动验证码的基本流程。从图像预处理到边缘检测,再到坐标计算,每一步都至关重要。需要注意的是,技术应当用于合法合规的数据采集场景,请勿用于非法入侵或破坏他人系统安全。
通过不断调试参数和优化算法,可以提高识别的准确率和成功率。希望这篇教程能为你的爬虫开发工作提供帮助。

微信公众号「极客日志」,在微信中扫描左侧二维码关注。展示文案:极客日志 zeeklog
使用加密算法(如AES、TripleDES、Rabbit或RC4)加密和解密文本明文。 在线工具,加密/解密文本在线工具,online
生成新的随机RSA私钥和公钥pem证书。 在线工具,RSA密钥对生成器在线工具,online
基于 Mermaid.js 实时预览流程图、时序图等图表,支持源码编辑与即时渲染。 在线工具,Mermaid 预览与可视化编辑在线工具,online
解析常见 curl 参数并生成 fetch、axios、PHP curl 或 Python requests 示例代码。 在线工具,curl 转代码在线工具,online
将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online
将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online