不想用selenium处理滑块验证码?教你用cv2解决

本文详细介绍如何使用OpenCV库解决滑块验证码问题,涉及安装技巧,滑块验证原理,以及通过cv2计算图片差异获取坐标的方法。通过实例演示了坐标识别流程和关键代码片段。

cv2解决滑块验证码验证

opencv-python安装

虽然cv2是直接通过导入cv2包使用,但是它不是通过import cv2安装,需要通过pip install opencv-python安装,直接pip安装可能会比较慢,可以使用pip install opencv-python -i https://pypi.tuna.tsinghua.edu.cn/simple安装

案例场景

在这里插入图片描述
在这里插入图片描述
当点击滑块时,会显示缺口背景图和方块,将方块移动到背景图缺口处就能实现验证,我们可以看看验证通过整个过程的请求包来判断它的验证逻辑
在这里插入图片描述
当我们点击滑块时,会去请求方块和背景图,当我们滑动并停止滑动滑块后,会发起一个验证请求,推测这个请求会把我们的动作传给后端验证,而我们的动作直接产生的就是坐标的变化,一般验证码验证会根据两种方式验证,坐标参数验证滑动轨迹验证码坐标参数验证是传递一个滑块停止后的坐标,而滑动轨迹验证码是传递一个坐标数组,记录滑块整个滑动周期变化的坐标。

我们查看异步请求验证这个包,看看它传递的参数便可以知道属于哪种验证逻辑
在这里插入图片描述
观察参数可以确定它传递的是滑块移动停止时的坐标,那怎么拿到这个坐标呢,dragleft我们假定是方块左侧坐标的距离,dragright我们假定是方块右侧坐标的距离,然后模拟一下查看style样式中left的变化。
在这里插入图片描述
多次观察可以确定,这个left便是dragleft的值,而dragrightdragleft要大32,这样我们只要知道dragleft的值便能确定dragright了。

cv2实战

使用cv2计算图片差异位置的坐标,我们需要拿到背景图片和方块图片,通过对比背景图片和方块图片之间的联系与差异从而定义差异的坐标。

cv2识别代码

# -*- coding: utf-8 -*-
from PIL import Image
from io import BytesIO
import numpy as np
import cv2


def identify_gap(bg, tp):
    """
    :param bg: 背景图片
    :param tp: 缺口图片
    :return int
    """
    # 读取背景图片和缺口图片
    bg_img = get_cv2_img(bg)  # 背景图片
    tp_img = get_cv2_img(tp)  # 缺口图片
    if type(bg_img) == str or type
<think> 我们被要求回答关于Selenium处理网页弹窗和验证码的方法,参考了站内引用[1][2][3][4]。 根据引用[1]和[2],我们知道Selenium可以处理窗口截图,而验证码处理是常见需求。 引用[3]提到处理弹窗和简单验证码,引用[4]则提到滑块验证码处理。 首先,网页弹窗主要有三种类型:alert、confirm、prompt。Selenium提供`switch_to.alert`来处理。 其次,验证码处理通常有几种方式:手动输入(临时)、绕过(如使用测试环境免验证码)、识别(OCR或第三方服务)、cookie跳过登录等。 下面我们分两部分详细说明: </think> ### Selenium处理网页弹窗和验证码的方法详解 #### 一、网页弹窗处理技巧 Selenium通过`switch_to.alert`模块处理三类常见弹窗: | 弹窗类型 | 处理方法 | 适用场景 | |-----------|-----------------------------------|----------------------| | Alert | `driver.switch_to.alert.accept()` | 简单通知框(确定按钮)| | Confirm | `alert.dismiss()` | 确认/取消选择框 | | Prompt | `alert.send_keys("text")` | 输入框弹窗 | **处理流程**: ```python # 等待弹窗出现(显式等待) from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC WebDriverWait(driver, 10).until(EC.alert_is_present()) # 切换到弹窗 alert = driver.switch_to.alert # 示例:处理带输入的弹窗 if "请输入验证码" in alert.text: alert.send_keys("123456") alert.accept() # 确认提交 else: alert.dismiss() # 关闭弹窗 ``` **特殊场景处理**: 1. **非标准弹窗(div模拟)**: ```python close_btn = driver.find_element("css selector", ".modal-close") close_btn.click() ``` 2. **多弹窗嵌套**: ```python main_window = driver.current_window_handle # 保存主窗口句柄 alert.accept() driver.switch_to.window(main_window) # 切回主窗口 ``` > 弹窗文本内容可通过`alert.text`获取,用于逻辑判断[^1][^3] --- #### 二、验证码处理策略 根据验证码类型采用不同方案: | 验证码类型 | 处理方案 | 实现难度 | 可靠性 | |------------|-----------------------------------|----------|--------| | 数字/字母 | OCR识别(Tesseract) | ★★☆ | ★★★ | | 滑块 | 轨迹模拟+缺口识别 | ★★★ | ★★★☆ | | 点选 | 图像识别+坐标点击 | ★★★★ | ★★☆ | | 智能验证 | Cookie复用/测试环境禁用 | ★☆ | ★★★★ | **具体实现方法**: 1. **OCR识别方案**: ```python from PIL import Image import pytesseract # 截取验证码区域 captcha = driver.find_element("id", "captcha-img") captcha.screenshot("captcha.png") # OCR识别 image = Image.open("captcha.png").convert('L') # 灰度处理 text = pytesseract.image_to_string(image) driver.find_element("id", "captcha-input").send_keys(text) ``` 2. **滑块验证解决方案**: ```python from selenium.webdriver import ActionChains # 获取滑块和轨道 slider = driver.find_element("class name", "slider") track = driver.find_element("class name", "track") # 模拟拖拽(含加速度模拟) actions = ActionChains(driver) actions.click_and_hold(slider).move_by_offset( track.size['width'] - 10, 0).release().perform() ``` 3. **Cookie跳过登录方案**: ```python # 首次手动登录后保存Cookie cookies = driver.get_cookies() import json with open("cookies.json", "w") as f: json.dump(cookies, f) # 后续自动加载Cookie driver.get("https://example.com/login") with open("cookies.json") as f: cookies = json.load(f) for cookie in cookies: driver.add_cookie(cookie) driver.refresh() # 刷新后生效 ``` > 对验证码要求高的场景,推荐使用第三方服务如:云打码、DeathByCaptcha等[^1][^4] --- #### 三、综合应用实例 ```python def handle_login_with_captcha(): driver.get("https://example.com/login") # 处理登录弹窗 try: alert = WebDriverWait(driver, 5).until(EC.alert_is_present()) if "隐私声明" in alert.text: alert.accept() except: pass # 填写凭证 driver.find_element("id", "username").send_keys("test") driver.find_element("id", "password").send_keys("pass123") # 验证码处理 if "captcha" in driver.page_source: captcha_img = driver.find_element("id", "captcha") captcha_img.screenshot("captcha.png") captcha_text = ocr_recognize("captcha.png") # 自定义OCR函数 driver.find_element("id", "captcha-input").send_keys(captcha_text) # 提交登录 driver.find_element("id", "submit-btn").click() # 保存会话状态 with open("session_cookies.json", "w") as f: json.dump(driver.get_cookies(), f) ``` > 关键技巧:结合显式等待`WebDriverWait`确保元素加载完成再操作[^2][^3] ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

九月镇灵将

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值