Selenium解决滑块验证问题:自动化与技巧

滑块验证是一种常见的人机验证机制,用于识别和防止自动化程序的访问。在爬虫和自动化测试中,我们经常面临需要处理滑块验证的情况。本文将介绍如何使用 Selenium 库处理滑块验证问题。

一、安装 Selenium
首先,确保你已经安装了 Selenium。你可以使用以下命令通过 pip 安装:

pip install selenium

同时,你还需要下载浏览器驱动程序。这里以 Chrome 浏览器为例,你可以在 ChromeDriver 官网 下载对应版本的 ChromeDriver。
Selenium解决滑块验证问题:自动化与技巧

二、滑块验证的工作原理

滑块验证通常涉及以下步骤:

1.用户访问目标网页。
2.网页显示一个滑块和目标区域。
3.用户需要拖动滑块到目标区域。
4.如果滑块成功到达目标区域,用户通常会被重定向到另一个页面或获得访问权限。
5.Selenium与滑块验证
6.Selenium是一个流行的网页自动化工具,它可以模拟真实用户的浏览器行为。然而,滑块验证机制的设计就是为了防止自动化工具的操作。因此,直接使用Selenium尝试拖动滑块通常会失败。

三、解决方法
为了解决这个问题,我们需要采取一些额外的步骤或技巧:

1.识别和定位滑块

首先,你需要定位滑块元素。这通常涉及使用XPath或其他定位方法来识别滑块元素。一旦你找到了滑块元素,你可以使用Selenium的click()或mouse_down()和mouse_up()方法来模拟拖动操作。

2.模拟拖动操作

模拟拖动操作时,你需要首先点击滑块,然后按住鼠标不放,同时移动到目标位置,最后松开鼠标。这可以通过以下代码实现:

from selenium import webdriver  
from selenium.webdriver.common.keys import Keys  
from selenium.webdriver.common.action_chains import ActionChains  driver = webdriver.Chrome()  # 使用你的浏览器驱动程序  
driver.get("your_website_url")  # 访问目标网页  

3.定位滑块并模拟拖动操作

slider = driver.find_element_by_xpath("slider_xpath")  # 使用适当的XPath定位滑块  
action = ActionChains(driver)  
action.click_and_hold(slider).perform()  # 点击并拖动滑块开始位置  
action.move_by_offset(offset_x, offset_y).perform()  # 移动到目标位置,需要计算偏移量  
action.release().perform()  # 松开鼠标,完成拖动操作

4.处理动态加载内容

某些滑块验证机制可能需要先加载一些动态内容,然后才能进行拖动操作。在这种情况下,你可能需要使用Selenium的等待机制(如WebDriverWait)来确保内容完全加载。

5.异常处理和重试机制

由于各种原因(如网络延迟、服务器响应慢等),拖动操作可能会失败。因此,实施一个异常处理和重试机制是很有必要的。这样,如果第一次尝试失败,程序可以自动重试几次。

6.使用浏览器自动化工具库(如Puppeteer)

有时,直接使用Selenium可能不是最佳选择。在这种情况下,你可以考虑使用其他浏览器自动化工具库,如Google的Puppeteer。Puppeteer为Node.js提供了一个高级API,可以更轻松地处理滑块验证等问题。

7.一个解决滑块问题的完整代码

from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.common.action_chains import ActionChains
import time
import base64
import cv2def identify_gap(bg, tp, out):'''bg: 背景图片tp: 缺口图片out:输出图片'''# 读取背景图片和缺口图片bg_img = cv2.imread(bg)  # 背景图片tp_img = cv2.imread(tp)  # 缺口图片# 识别图片边缘bg_edge = cv2.Canny(bg_img, 100, 200)tp_edge = cv2.Canny(tp_img, 100, 200)# 转换图片格式bg_pic = cv2.cvtColor(bg_edge, cv2.COLOR_GRAY2RGB)tp_pic = cv2.cvtColor(tp_edge, cv2.COLOR_GRAY2RGB)# 缺口匹配res = cv2.matchTemplate(bg_pic, tp_pic, cv2.TM_CCOEFF_NORMED)min_val, max_val, min_loc, max_loc = cv2.minMaxLoc(res)  # 寻找最优匹配# 绘制方框th, tw = tp_pic.shape[:2]tl = max_loc  # 左上角点的坐标br = (tl[0] + tw, tl[1] + th)  # 右下角点的坐标cv2.rectangle(bg_img, tl, br, (0, 0, 255), 2)  # 绘制矩形cv2.imwrite(out, bg_img)  # 保存在本地print(tl[0])# 返回缺口的X坐标return tl[0]# 启动浏览器
driver = webdriver.Chrome()# 打开网页
driver.get("https://netc1.igtb.bankofchina.com/#/login-page")
driver.maximize_window()
time.sleep(5)
# 定位滑块元素
slider = driver.find_element(By.XPATH,'/html/body/div[1]/div/div[2]/div/div/form/div[5]/div/div/div/div/div[2]/div[2]/div[2]/div[1]')  # 替换为实际的滑块元素的IDimage_url = driver.find_element(By.CSS_SELECTOR, '#dx_captcha_basic_sub-slider_2 > img').get_attribute("src")
print(image_url)
img_element = driver.find_element(By.CSS_SELECTOR, '#dx_captcha_basic_sub-slider_2 > img')
parent_element = driver.find_element(By.CSS_SELECTOR,'#dx_captcha_basic_sub-slider_2')
original_style = img_element.get_attribute('style')image_selector = "#dx_captcha_basic_sub-slider_2 > img"
# 使用 JavaScript 修改图片元素的样式,将其显示出来
show_image_script = f'''var img = document.querySelector("{image_selector}");img.style.position = "absolute";img.style.left = "10px";  // 替换为你想要的横坐标img.style.top = "10px";    // 替换为你想要的纵坐标document.body.appendChild(img);  // 将图片移动到 body 元素下'''
driver.execute_script(show_image_script)
driver.save_screenshot("D:/quanping.png")
time.sleep(5)
driver.execute_script(f'arguments[0].style = "{original_style}";', img_element)
driver.execute_script("arguments[1].appendChild(arguments[0]);", img_element, parent_element)time.sleep(2)
try:# 执行 JavaScript 脚本,获取 Canvas 中的图片数据canvas_image_data = driver.execute_script("""var canvas = document.getElementsByTagName('canvas')[0];// 将 Canvas 导出为图像数据var imageData = canvas.toDataURL("image/png");// 返回图像数据return imageData;""",)# 解码图像数据image_data = base64.b64decode(canvas_image_data.split(",")[1])# 将图像数据保存到文件with open("huakuai/bj.png", "wb") as image_file:image_file.write(image_data)except Exception as e:print(f"An error occurred: {str(e)}")im = cv2.imread('D:/quanping.png')
im = im[12:58,12:58]
cv2.imwrite('huakuai/quekuai.png',im)
a=identify_gap("huakuai/bj.png","huakuai/quekuai.png","huakuai/out.png")action = ActionChains(driver)
# action.click_and_hold(slider).move_by_offset(a, 0).release().perform()
i=0
print(a)
action.speed = 0.5
action.click_and_hold(slider).move_by_offset(a, 0).release().perform()
time.sleep(20)
driver.quit()

四、结论
滑块验证是一种常见的网站安全机制,但也可以通过自动化工具进行破解。使用Selenium结合适当的技巧和方法,你可以有效地解决滑块验证问题。然而,请始终确保你的行为符合法律和道德标准,尊重网站的版权和隐私权。在处理真实网站时,务必先获得适当的授权或遵循相关法律和指导方针。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/653597.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【极数系列】Linux环境搭建Flink1.18版本 (03)

文章目录 引言01 Linux部署JDK11版本1.下载Linux版本的JDK112.创建目录3.上传并解压4.配置环境变量5.刷新环境变量6.检查jdk安装是否成功 02 Linux部署Flink1.18.0版本1.下载Flink1.18.0版本包2.上传压缩包到服务器3.修改flink-config.yaml配置4.启动服务5.浏览器访问6.停止服务…

[go] 享元模式

享元模式 是一种结构型设计模式, 它摒弃了在每个对象中保存所有数据的方式, 通过共享多个对象所共有的相同状态, 让你能在有限的内存容量中载入更多对象。 模型说明 享元模式只是一种优化。在应用该模式之前,你要确定程序中存在…

二叉树--199. 二叉树的右视图/medium 理解度C

199. 二叉树的右视图 1、题目2、题目分析3、复杂度最优解代码示例4、适用场景 1、题目 给定一个二叉树的 根节点 root,想象自己站在它的右侧,按照从顶部到底部的顺序,返回从右侧所能看到的节点值。 示例 1: 输入: [1,2,3,null,5,null,4] 输出…

贪吃蛇项目(基于C语言和数据结构中的链表)

建立文件 首先先建立3个文件。 Snake.h 函数的声明 Snake.c 函数的定义 Test.c 贪吃蛇的测试 分析项目 我们分析这整个项目 建立节点 首先在我们实现游戏开始的部分之前,我们要先创建贪吃蛇的节点,再由此创建整个贪吃蛇所包含的一些信息&#…

基于对比学习的信息抽取

Label Refinement via Contrastive Learning for Distantly-Supervised Named Entity Recognition NAACL 2022;做的远程监督NER,通过知识库构建 伪标签,通过对比学习构建负样本,负样本是entity的多余部分或其他不相关部分。即对e…

【Vite+Vue3+TS】基于Vite+Vue3+TypeScript+ESLint+Prettier+Stylelint搭建项目(亲测超详细)

目 录 项目搭建步骤确定node版本使用Vite创建Vue3项目规范目录结构配置环境修改Vite配置文件集成路由工具Vue Router集成状态管理工具Pinia集成CSS预编译器Sassvite-plugin-svg-icons图标组件集成UI框架Element Plus集成HTTP 请求工具 Axios 项目代码规范集成ESLint配置集成Pre…

【HTML 基础】元素和标签

文章目录 1. <p> - 段落标签2. <h1> - <h6> - 标题标签3. <a> - 超链接标签4. <img> - 图片标签5. <ul>, <ol>, <li> - 列表标签无序列表有序列表 总结 HTML&#xff08;Hypertext Markup Language&#xff09;是构建 Web 页面…

Debezium日常分享系列之:Debezium 2.6.0.Alpha1发布

Debezium日常分享系列之&#xff1a;Debezium 2.6.0.Alpha1发布 一、重大改变1.MongoDB2.重新选择列后处理器 二、改进和变化1.添加了新的匹配集合 API2.CloudEvents 架构名称自定义3.Oracle Infinispan 缓存改进4.支持 Spanner NEW_ROW_AND_OLD_VALUES 值捕获类型 一、重大改变…

【学网攻】 第(13)节 -- 动态路由(OSPF)

系列文章目录 目录 系列文章目录 文章目录 前言 一、动态路由是什么&#xff1f; 二、实验 1.引入 实验拓扑图 实验配置 实验验证 总结 文章目录 【学网攻】 第(1)节 -- 认识网络【学网攻】 第(2)节 -- 交换机认识及使用【学网攻】 第(3)节 -- 交换机配置聚合端口【学…

鸿蒙 ArkTs初识

前提&#xff1a;基于官网3.1/4.0文档。参考官网文档 基于Android开发体系来进行比较和思考。&#xff08;或有偏颇&#xff0c;自行斟酌&#xff09; 吐槽&#xff1a;官网上的案例只有代码和文档解释&#xff0c;没有可以直接运行查看效果的模拟器&#xff0c;这一点上&#…

【C++修行之道】STL(初识list、stack)

目录 一、list 1.1list的定义和结构 以下是一个示例&#xff0c;展示如何使用list容器: 1.2list的常用函数 1.3list代码示例 二、stack 2.1stack的定义和结构 stack的常用定义 2.2常用函数 2.3stack代码示例 一、list 1.1list的定义和结构 list的使用频率不高&#…

SQL注入:二次注入

SQL注入系列文章&#xff1a; 初识SQL注入-CSDN博客 SQL注入&#xff1a;联合查询的三个绕过技巧-CSDN博客 SQL注入&#xff1a;报错注入-CSDN博客 SQL注入&#xff1a;盲注-CSDN博客 目录 什么是二次注入&#xff1f; 二次注入演示 1、可以注册新用户 2、可以登录->…

【 JS 】函数

生命如潮&#xff0c;不断奔向远方的海洋。每一个潮起潮落&#xff0c;都是奋斗的旋律&#xff1b;每一片浪花&#xff0c;都是梦想的飞扬。勇往直前&#xff0c;扬帆远航&#xff0c;生命的航程注定精彩非凡。 - 林肯 目标 理解封装的意义&#xff0c;能够通过函数的声明实现逻…

通过mybatis拦截器给sql执行加一个耗时监控

代码没什么内容&#xff0c;直接贴上来吧&#xff0c;其中costTimeUtil可以看我的另一篇博文&#xff1a;java实现一个不带次数变量的加权平均值算法-CSDN博客 Slf4j Intercepts({Signature(type StatementHandler.class,method "query",args {Statement.class, …

1Panel CloudFlare证书申请失败的解决方案

在升级1Panel后&#xff0c;使用 CloudFlare DNS验证时&#xff0c;会提示 [*.biliwind.com] [*.biliwind.com] acme: error presenting token: cloudflare: failed to find zone biliwind.com.: ListZonesContext command failed: Invalid request headers (6003) 为解决此问…

系统分析师-21年-论文试题

系统分析师-21年-论文试题 更多软考知识请访问 https://ruankao.blog.csdn.net/ 题目任选其一 摘要字数在400字以内&#xff0c;可以分条叙述&#xff0c;但不允许有图、表、流程图。 正文字数为2000字至300字&#xff0c;文中可以分条叙述&#xff0c;但不要全部用分条叙述…

2023年全球软件开发大会(QCon广州站2023):核心内容与学习收获(附大会核心PPT下载)

在全球化的科技浪潮中&#xff0c;软件开发行业日新月异&#xff0c;持续推动着社会经济的飞速发展。本次峰会以“引领未来&#xff0c;探索无限可能”为主题&#xff0c;聚焦软件开发领域的最新技术、最佳实践和创新思想。来自世界各地的顶级专家、企业领袖和开发者齐聚一堂&a…

防范[myers@airmail.cc].mkp攻击:解密[myers@airmail.cc].mkp勒索病毒的方法

引言&#xff1a; 随着科技的迅猛发展&#xff0c;网络安全问题日益突出&#xff0c;而勒索病毒也成为当前互联网威胁中的一大焦点。其中&#xff0c;[datastorecyberfear.com].mkp [hendersoncock.li].mkp [hudsonLcock.li].mkp[myersairmail.cc].mkp勒索病毒以其强大的加密能…

LeetCode第523题 - 连续的子数组和

题目 给定一个包含非负数的数组和一个目标整数 k&#xff0c;编写一个函数来判断该数组是否含有连续的子数组&#xff0c;其大小至少为 2&#xff0c;总和为 k 的倍数&#xff0c;即总和为 n*k&#xff0c;其中 n 也是一个整数。 示例 1: 输入: [23,2,4,6,7], k 6 输出: True …

什么是防抖和节流?有什么区别?如何实现?

文章目录 一、是什么定义代码实现节流防抖 二、区别三、应用场景 一、是什么 本质上是优化高频率执行代码的一种手段 如&#xff1a;浏览器的 resize、scroll、keypress、mousemove 等事件在触发时&#xff0c;会不断地调用绑定在事件上的回调函数&#xff0c;极大地浪费资源…