【愚公系列】《Python网络爬虫从入门到精通》048-验证码识别(滑动拼图验证码)

举报
愚公搬代码 发表于 2025/05/18 21:53:52 2025/05/18
【摘要】 🌟【技术大咖愚公搬代码:全栈专家的成长之路,你关注的宝藏博主在这里!】🌟📣开发者圈持续输出高质量干货的"愚公精神"践行者——全网百万开发者都在追更的顶级技术博主!👉 江湖人称"愚公搬代码",用七年如一日的精神深耕技术领域,以"挖山不止"的毅力为开发者们搬开知识道路上的重重阻碍!💎【行业认证·权威头衔】 ✔ 华为云天团核心成员:特约编辑/云享专家/开发者专家/产品云测专家 ✔ 开发者...

🌟【技术大咖愚公搬代码:全栈专家的成长之路,你关注的宝藏博主在这里!】🌟

📣开发者圈持续输出高质量干货的"愚公精神"践行者——全网百万开发者都在追更的顶级技术博主!

👉 江湖人称"愚公搬代码",用七年如一日的精神深耕技术领域,以"挖山不止"的毅力为开发者们搬开知识道路上的重重阻碍!

💎【行业认证·权威头衔】 ✔ 华为云天团核心成员:特约编辑/云享专家/开发者专家/产品云测专家 ✔ 开发者社区全满贯:CSDN博客&商业化双料专家/阿里云签约作者/腾讯云内容共创官/掘金&亚马逊&51CTO顶级博主 ✔ 技术生态共建先锋:横跨鸿蒙、云计算、AI等前沿领域的技术布道者

🏆【荣誉殿堂】 🎖 连续三年蝉联"华为云十佳博主"(2022-2024) 🎖 双冠加冕CSDN"年度博客之星TOP2"(2022&2023) 🎖 十余个技术社区年度杰出贡献奖得主

📚【知识宝库】 覆盖全栈技术矩阵: ◾ 编程语言:.NET/Java/Python/Go/Node... ◾ 移动生态:HarmonyOS/iOS/Android/小程序 ◾ 前沿领域:物联网/网络安全/大数据/AI/元宇宙 ◾ 游戏开发:Unity3D引擎深度解析 每日更新硬核教程+实战案例,助你打通技术任督二脉!

💌【特别邀请】 正在构建技术人脉圈的你: 👍 如果这篇推文让你收获满满,点击"在看"传递技术火炬 💬 在评论区留下你最想学习的技术方向 ⭐ 点击"收藏"建立你的私人知识库 🔔 关注公众号获取独家技术内参 ✨与其仰望大神,不如成为大神!关注"愚公搬代码",让坚持的力量带你穿越技术迷雾,见证从量变到质变的奇迹!✨ |

🚀前言

在爬虫开发中,我们经常会遇到不同类型的验证码,其中滑动拼图验证码因其特殊的交互性和较高的安全性,成为了爬虫开发者面临的一大难题。

本篇文章,我们将深入研究如何识别并绕过滑动拼图验证码。与传统的字符验证码或简单的图形验证码不同,滑动拼图验证码通常要求用户通过滑动某个图形块,使其与背景图片完全对接,这种验证码不仅考验了图像识别技术,还涉及到一定的图像处理和模拟鼠标操作技巧。

在这篇文章中,我们将探讨:

  1. 滑动拼图验证码的基本原理:了解滑动拼图验证码如何工作,以及其识别的难点。
  2. 图像处理与特征提取:如何从验证码的背景图和拼图块中提取有效特征。
  3. 模拟滑动操作:使用Python模拟滑动拼图验证码的拖动操作,成功绕过验证。
  4. 实战案例:通过具体的实例,展示如何应用这些技术解决实际的滑动拼图验证码。

通过学习本篇文章,你将能够掌握滑动拼图验证码的识别技巧,并能够在爬虫项目中有效地应对这一挑战,提升自动化抓取的能力。

🚀一、滑动拼图验证码识别

🔎1.验证码原理

  • 验证逻辑:用户需将图形滑块拖动至主图空缺位置,系统校验滑动距离是否匹配。
  • 关键参数:通过 left 属性值计算滑动距离(按钮滑块与图形滑块的差值)。
  • 测试地址:http://sck.rikflm.com:666/spider/jigsaw/

🔎2.实现步骤

步骤1:定位HTML元素

  1. 使用浏览器开发者工具分析页面结构,定位以下元素:
    • 按钮滑块:<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.关键代码说明

  1. 初始化浏览器:通过 webdriver.Chrome() 启动浏览器并加载目标网页。
  2. 动作链操作:
    • click_and_hold():模拟按住滑块不放。
    • move_by_offset(0, 0):初始化动作链(必须执行以获取滑块样式)。
  3. 提取滑动距离:
    • 使用正则表达式从 style 属性中提取 left 值。
    • 滑动距离 = 空缺滑块 left 值 - 图形滑块初始 left 值。
  4. 执行滑动:通过 move_by_offset(distance, 0) 模拟横向滑动,最后释放鼠标。

🔎5.注意事项

  1. 动态加载问题:若页面元素异步加载,需添加显式等待(如 WebDriverWait)。
  2. 反爬机制:部分网站会检测自动化工具,需结合 ChromeOptions 隐藏自动化特征。
  3. 滑块轨迹:直接移动可能被识别为机器人,可模拟加速-减速轨迹。
  4. 验证码复杂度:若空缺位置随机,需通过图像识别技术(如OpenCV)定位缺口。
【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。