【愚公系列】《Python网络爬虫从入门到精通》048-验证码识别(滑动拼图验证码)
🌟【技术大咖愚公搬代码:全栈专家的成长之路,你关注的宝藏博主在这里!】🌟
📣开发者圈持续输出高质量干货的"愚公精神"践行者——全网百万开发者都在追更的顶级技术博主!
👉 江湖人称"愚公搬代码",用七年如一日的精神深耕技术领域,以"挖山不止"的毅力为开发者们搬开知识道路上的重重阻碍!
💎【行业认证·权威头衔】 ✔ 华为云天团核心成员:特约编辑/云享专家/开发者专家/产品云测专家 ✔ 开发者社区全满贯:CSDN博客&商业化双料专家/阿里云签约作者/腾讯云内容共创官/掘金&亚马逊&51CTO顶级博主 ✔ 技术生态共建先锋:横跨鸿蒙、云计算、AI等前沿领域的技术布道者
🏆【荣誉殿堂】 🎖 连续三年蝉联"华为云十佳博主"(2022-2024) 🎖 双冠加冕CSDN"年度博客之星TOP2"(2022&2023) 🎖 十余个技术社区年度杰出贡献奖得主
📚【知识宝库】 覆盖全栈技术矩阵: ◾ 编程语言:.NET/Java/Python/Go/Node... ◾ 移动生态:HarmonyOS/iOS/Android/小程序 ◾ 前沿领域:物联网/网络安全/大数据/AI/元宇宙 ◾ 游戏开发:Unity3D引擎深度解析 每日更新硬核教程+实战案例,助你打通技术任督二脉!
💌【特别邀请】 正在构建技术人脉圈的你: 👍 如果这篇推文让你收获满满,点击"在看"传递技术火炬 💬 在评论区留下你最想学习的技术方向 ⭐ 点击"收藏"建立你的私人知识库 🔔 关注公众号获取独家技术内参 ✨与其仰望大神,不如成为大神!关注"愚公搬代码",让坚持的力量带你穿越技术迷雾,见证从量变到质变的奇迹!✨ |
🚀前言
在爬虫开发中,我们经常会遇到不同类型的验证码,其中滑动拼图验证码因其特殊的交互性和较高的安全性,成为了爬虫开发者面临的一大难题。
本篇文章,我们将深入研究如何识别并绕过滑动拼图验证码。与传统的字符验证码或简单的图形验证码不同,滑动拼图验证码通常要求用户通过滑动某个图形块,使其与背景图片完全对接,这种验证码不仅考验了图像识别技术,还涉及到一定的图像处理和模拟鼠标操作技巧。
在这篇文章中,我们将探讨:
-
滑动拼图验证码的基本原理:了解滑动拼图验证码如何工作,以及其识别的难点。 -
图像处理与特征提取:如何从验证码的背景图和拼图块中提取有效特征。 -
模拟滑动操作:使用Python模拟滑动拼图验证码的拖动操作,成功绕过验证。 -
实战案例:通过具体的实例,展示如何应用这些技术解决实际的滑动拼图验证码。
通过学习本篇文章,你将能够掌握滑动拼图验证码的识别技巧,并能够在爬虫项目中有效地应对这一挑战,提升自动化抓取的能力。
🚀一、滑动拼图验证码识别
🔎1.验证码原理
-
验证逻辑:用户需将图形滑块拖动至主图空缺位置,系统校验滑动距离是否匹配。 -
关键参数:通过 left
属性值计算滑动距离(按钮滑块与图形滑块的差值)。 -
测试地址:http://sck.rikflm.com:666/spider/jigsaw/

🔎2.实现步骤
步骤1:定位HTML元素
-
使用浏览器开发者工具分析页面结构,定位以下元素: -
按钮滑块: <span>
标签,默认left: 0px
-
图形滑块: <div>
标签,默认left: 10px
-
空缺滑块: <div>
标签,验证成功时left: 184px
-
步骤2:计算滑动距离
-
拖动后按钮滑块的 left
值变化:0px → 174px
-
图形滑块的 left
值变化:10px → 184px
-
滑动距离公式: 滑动距离 = 空缺滑块 left 值 - 图形滑块初始 left 值
可以看出按钮滑块在默认情况下left的值为0px,而图形滑块在默认情况下left的直为10px。验证成功后按钮滑块的left值为174px,而图形滑块的left值为184px。此时可以总结出整个验证过程中滑块的位置变化,如图所示。

🔎3.代码实现
from selenium import webdriver # 导入webdriver
import re # 导入正则模块
driver = webdriver.Chrome() # 谷歌浏览器
driver.get('http://localhost:8080/demo13/') # 启动网页
swiper = driver.find_element_by_xpath(
'/html/body/div/div[2]/div[2]/span[1]') # 获取按钮滑块
action = webdriver.ActionChains(driver) # 创建动作
action.click_and_hold(swiper).perform() # 单击并保证不松开
# 滑动0距离,不松手,不执行该动作无法获取图形滑块left值
action.move_by_offset(0,0).perform()
# 获取图形滑块样式
verify_style = driver.find_element_by_xpath(
'/html/body/div/div[2]/div[1]/div[1]').get_attribute('style')
# 获取空缺滑块样式
verified_style = driver.find_element_by_xpath(
'/html/body/div/div[2]/div[1]/div[2]').get_attribute('style')
# 获取空缺滑块left值
verified_left =float(re.findall('left: (.*?)px;',verified_style)[0])
# 获取图形滑块left值
verify_left =float(re.findall('left: (.*?)px;',verify_style)[0])
action.move_by_offset(verified_left-verify_left,0) # 滑动指定距离
action.release().perform() # 松开鼠标

🔎4.关键代码说明
-
初始化浏览器:通过 webdriver.Chrome()
启动浏览器并加载目标网页。 -
动作链操作: -
click_and_hold()
:模拟按住滑块不放。 -
move_by_offset(0, 0)
:初始化动作链(必须执行以获取滑块样式)。
-
-
提取滑动距离: -
使用正则表达式从 style
属性中提取left
值。 -
滑动距离 = 空缺滑块 left
值 - 图形滑块初始left
值。
-
-
执行滑动:通过 move_by_offset(distance, 0)
模拟横向滑动,最后释放鼠标。
🔎5.注意事项
-
动态加载问题:若页面元素异步加载,需添加显式等待(如 WebDriverWait
)。 -
反爬机制:部分网站会检测自动化工具,需结合 ChromeOptions
隐藏自动化特征。 -
滑块轨迹:直接移动可能被识别为机器人,可模拟加速-减速轨迹。 -
验证码复杂度:若空缺位置随机,需通过图像识别技术(如OpenCV)定位缺口。
- 点赞
- 收藏
- 关注作者
评论(0)