Python实现滑块验证码详解

作者:Triumph19 时间:2022-03-15 09:04:53 

本节要讲解如下图所示的滑块验证码(更为复杂的滑动拼图验证码在下一篇介绍)。这种验证码机制比较简单:将滑块拖动到滑轨的最右端即可完成验证,如下图所示。如果未将滑块拖动到滑轨的最右端,则无法通过验证,验证失败后滑块会回到起始位置。

Python实现滑块验证码详解

其中的关键是需要用Selenium库模拟鼠标拖动滑块滑动一定的距离。因为滑块的起始位置和滑轨的起始位置相同,所以滑块需要移动的距离等于滑轨的跨度减去滑块的宽度。下面就来利用开发者工具查看滑轨和滑块的宽度。

在浏览器中打开本书配套代码文件中为滑块验证码搭建的本地网页文件“index.html”,打开开发者工具,然后用元素选择按钮选中整个滑轨,此时的界面如下图所示。可以看到其中显示了滑轨的尺寸和颜色等属性。要查看滑轨的尺寸,有两种方法:图中箭头所示。

Python实现滑块验证码详解

滑块宽度的查看方法和滑轨相同,用元素选择工具选中滑块,可以看到滑块的宽度。由此可知需要模拟滑动的距离为260像素。

Python实现滑块验证码详解

下图开始编写代码。首先用Selenium库打开网页,代码如下:

from selenium import webdriver
browser = webdriver.Chrome()
url = r'D:\works\python_crawl1\《Python爬虫(进阶与进通)》代码汇总\2.验证码反爬\3.滑块验证码\index.html'
browser.get(url) #用模拟浏览器打开网页

然后用Selenium定位滑块,代码如下:

huakuai = browser.find_element_by_xpath('//*[@id="code-box"]/span')

定位到滑块后,就可以准备拖动滑块了。在拖动过程中要保持鼠标为按下状态,不能过早松开鼠标,所以不能使用click()函数。Selenium库提供了一个ActionChains模块,其中的click_and_hold()函数可以使鼠标保持按下状态,release()函数可以松开鼠标,move_by_offset()函数可以使鼠标移动。结合使用这些函数即可将滑块拖动一定距离,代码如下:

action = webdriver.ActionChains(browser) # 启动动作链
action.click_and_hold(huakuai).perform() #按住滑块
action.move_by_offset(260,0) #移动滑块,其中的260是之前计算出来的需要滑动的距离
action.release().perform() #释放滑块

完整代码如下,其中还用time库的sleep()函数在模拟滑动前等待两秒,以便观察滑动效果。

from selenium import webdriver
import time
# 1.访问网址
browser = webdriver.Chrome()
url = r'D:\works\python_crawl1\《Python爬虫(进阶与进通)》代码汇总\2.验证码反爬\3.滑块验证码\index.html'
browser.get(url) #用模拟浏览器打开网页
# 2.定位滑块
huakuai = browser.find_element_by_xpath('//*[@id="code-box"]/span')
# 3.开始滑动
action = webdriver.ActionChains(browser) # 启动动作链
action.click_and_hold(huakuai).perform() #按住滑块
time.sleep(2)
action.move_by_offset(260,0) #移动滑块,其中的260是之前计算出来的需要滑动的距离
action.release().perform() #释放滑块

最终运行结果如下图所示,模拟滑块成功。

Python实现滑块验证码详解

需要注意的是,现在有一些含有滑块验证码的网页会检测当前浏览器是否为Selenium库的webdriver模拟浏览器,如果是的话,便很难模拟滑动成功。这种反爬机制已经不是验证码反爬,而是webdriver反爬,处理起来比较困难。这里有一个讨巧的解决方法:如果登录阶段需要进行滑动验证(如淘宝的登录),那么可以在代码中用time.sleep()等待一段时间,在这段时间内用其他方式手动登录,如手动扫码登录,登录成功后再用Selenium库继续爬取。

来源:https://blog.csdn.net/Triumph19/article/details/124571151

标签:Python,滑块,验证码
0
投稿

猜你喜欢

  • 减少新开窗口提升可访问性

    2009-04-17 13:56:00
  • js实现千分符和保留几位小数的简单实例

    2023-08-21 10:03:26
  • Python 中的json常见用法实例详解

    2022-01-03 15:28:48
  • ThinkPHP5.0框架控制器继承基类和自定义类示例

    2024-05-03 15:52:24
  • 本地文件上传到七牛云服务器示例(七牛云存储)

    2023-09-17 09:00:05
  • Pytorch 使用CNN图像分类的实现

    2023-04-01 03:24:21
  • 使用javascript修复浏览器中12个常见而又头痛的问题

    2008-10-28 19:38:00
  • python利用K-Means算法实现对数据的聚类案例详解

    2021-02-28 10:01:29
  • Linux下设置每天自动备份数据库的方法

    2024-01-24 02:45:31
  • 浅谈pytorch 模型 .pt, .pth, .pkl的区别及模型保存方式

    2023-11-25 12:41:38
  • GoJs的文本绘图模板TextBlock使用实例

    2023-08-26 16:01:00
  • python改变日志(logging)存放位置的示例

    2023-07-04 06:37:58
  • 使用DataFrame删除行和列的实例讲解

    2021-03-05 21:06:04
  • python with提前退出遇到的坑与解决方案

    2023-12-24 15:02:35
  • python对 MySQL 数据库进行增删改查的脚本

    2024-01-18 07:04:24
  • 使用BULK INSERT大批量导入数据 SQLSERVER

    2012-01-05 19:26:36
  • 跟老齐学Python之折腾一下目录

    2021-10-07 03:07:52
  • Python基于回溯法子集树模板解决选排问题示例

    2023-02-15 18:12:37
  • Golang学习笔记(一):简介

    2024-02-22 18:59:28
  • ubuntu 18.04搭建python环境(pycharm+anaconda)

    2023-09-23 20:01:56
  • asp之家 网络编程 m.aspxhome.com