Python实现滑块验证码详解
作者:Triumph19 发布时间:2022-03-15 09:04:53
本节要讲解如下图所示的滑块验证码(更为复杂的滑动拼图验证码在下一篇介绍)。这种验证码机制比较简单:将滑块拖动到滑轨的最右端即可完成验证,如下图所示。如果未将滑块拖动到滑轨的最右端,则无法通过验证,验证失败后滑块会回到起始位置。
其中的关键是需要用Selenium库模拟鼠标拖动滑块滑动一定的距离。因为滑块的起始位置和滑轨的起始位置相同,所以滑块需要移动的距离等于滑轨的跨度减去滑块的宽度。下面就来利用开发者工具查看滑轨和滑块的宽度。
在浏览器中打开本书配套代码文件中为滑块验证码搭建的本地网页文件“index.html”,打开开发者工具,然后用元素选择按钮选中整个滑轨,此时的界面如下图所示。可以看到其中显示了滑轨的尺寸和颜色等属性。要查看滑轨的尺寸,有两种方法:图中箭头所示。
滑块宽度的查看方法和滑轨相同,用元素选择工具选中滑块,可以看到滑块的宽度。由此可知需要模拟滑动的距离为260像素。
下图开始编写代码。首先用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() #释放滑块
最终运行结果如下图所示,模拟滑块成功。
需要注意的是,现在有一些含有滑块验证码的网页会检测当前浏览器是否为Selenium库的webdriver模拟浏览器,如果是的话,便很难模拟滑动成功。这种反爬机制已经不是验证码反爬,而是webdriver反爬,处理起来比较困难。这里有一个讨巧的解决方法:如果登录阶段需要进行滑动验证(如淘宝的登录),那么可以在代码中用time.sleep()等待一段时间,在这段时间内用其他方式手动登录,如手动扫码登录,登录成功后再用Selenium库继续爬取。
来源:https://blog.csdn.net/Triumph19/article/details/124571151


猜你喜欢
- 在 Go 语言中,指针是一种重要的概念。了解和正确使用指针对于理解语言的底层机制、编写高效的代码以及处理复杂数据结构都非常关键。本文将深入探
- array_unique() 定义和用法 array_unique() 函数移除数组中的重复的值,并返回结果数组。 当几个数组元素的值相等时
- pandas中遍历dataframe的每一个元素假如有一个需求场景需要遍历一个csv或excel中的每一个元素,判断这个元素是否含有某个关键
- 析构函数:当某个对象成为垃圾或者当对象被显式销毁时执行。GC(Garbage Collector) 在PHP中,没有任何变量指向这个对象时,
- 在JavaScript中单选框的用法和复选框相似。不同之处在于HTML中的应用。复选框是一种开关。如果
- 序列是Python中最基本的数据结构。序列中的每个元素都分配一个数字 - 它的位置,或索引,第一个索引是0,第二个索引是1,依此类推。Pyt
- PHP有效的时间戳典型范围是格林威治时间 1901 年 12 月 13 日 20:45:54 到 203
- [PHP] ; PHP还是一个不断发展的工具,其功能还在不断地删减 ; 而php.ini的设置更改可以反映出相当的变化,
- 数据科学领域日常使用 Python 处理大规模数据集的时候经常需要使用到合并、链接的方式进行数据集的整合,其中应用的数据类型包括 Serie
- 本文实例讲述了Python实现繁體转为简体的方法。分享给大家供大家参考,具体如下:这里需要用到两个文件,可以点击此处本站下载源文件:zh_w
- 文/图 安全天使·angel[BST]前言我的《SQL Injection with MySQL》(《黑客防线》7月的专题)已经对MySQL
- 纪要本文用于记录学习 Python 过程中遇到的一些小问题,如果遇到的是比较大的问题会单独开页面分析学习处处有坑1. 文件读取 open#
- 使用time模块可以查看并处理时间和日期相关内容。一、时间的表示格式在Python中,表示时间的格式有4种较为常用,分别是浮点数格式、标准可
- 前言在大多数介绍 Buffer 的文章中,主要是围绕数据拼接和内存分配这两方面的。比如我们使用fs模块来读取文件内容的时候,返回的就是一个
- 下载源码git clone https://github.com/mysql/mysql-server.gitcd mysql-server
- 开发环境:Pycharm 2018.3 + Anaconda3(5.3.0) + Python 3.7.1 + Numpy 1.15.4在此
- 如下所示:from urllib.parse import quoteimport stringurl = r'http://www
- 开发动机:最近用手机QQ浏览器下载了一些视频,视频越来越多,占用了手机内存,于是想把下载的视频传到电脑上保存,可后来发现这些视频都是m3u8
- print() 函数使用以 % 开头的转换说明符对各种类型的数据进行格式化输出。转换说明符(Conversion Specifier)只是一
- 控制资源访问前文提到threading库在多线程时,对同一资源的访问容易导致破坏与丢失数据。为了保证安全的访问一个资源对象,我们需要创建锁。