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

其中的关键是需要用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) #用模拟浏览器打开网页|
1
|
huakuai = browser.find_element_by_xpath('//*[@id="code-box"]/span') |
定位到滑块后,就可以准备拖动滑块了。在拖动过程中要保持鼠标为按下状态,不能过早松开鼠标,所以不能使用click()函数。Selenium库提供了一个ActionChains模块,其中的click_and_hold()函数可以使鼠标保持按下状态,release()函数可以松开鼠标,move_by_offset()函数可以使鼠标移动。结合使用这些函数即可将滑块拖动一定距离,代码如下:
|
1
2
3
4
|
action = webdriver.ActionChains(browser) # 启动动作链action.click_and_hold(huakuai).perform() #按住滑块action.move_by_offset(260,0) #移动滑块,其中的260是之前计算出来的需要滑动的距离action.release().perform() #释放滑块 |
完整代码如下,其中还用time库的sleep()函数在模拟滑动前等待两秒,以便观察滑动效果。
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
from selenium import webdriverimport 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() #释放滑块 |
最终运行结果如下图所示,模拟滑块成功。

借鉴后的改进:代码计算滑块需要滑动的距离
# 获取滑块长,宽
button = browser.find_element_by_xpath('//*[@id="code_box"]/span')
small_sliding = button.size
# 获取整个div的长,宽
big_sliding = browser.find_element_by_id('code_box').size
# 滑动的距离
sliding_distance = big_sliding.get('width') - small_sliding.get('width')
原文见:https://www.jb51.net/article/247040.htm 感谢作者解决了我工作中的难题。

浙公网安备 33010602011771号