Python中如何处理大众点评滑动验证码

添加 cookie 后 20 分钟左右弹出,浏览器打开怎么滑动都是验证失败。求分享经验
Python中如何处理大众点评滑动验证码

2 回复

对于大众点评这类网站的滑动验证码,通常需要模拟用户滑动轨迹来破解。这里提供一个基于Selenium和OpenCV的解决方案:

from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.action_chains import ActionChains
import time
import cv2
import numpy as np
import requests
from io import BytesIO

def handle_slider_captcha():
    # 初始化浏览器
    driver = webdriver.Chrome()
    driver.get("https://www.dianping.com/")
    
    try:
        # 等待验证码出现
        wait = WebDriverWait(driver, 10)
        slider = wait.until(
            EC.presence_of_element_located((By.CLASS_NAME, "geetest_slider_button"))
        )
        
        # 获取背景图和缺口图
        bg_img = driver.find_element(By.CLASS_NAME, "geetest_bg")
        slice_img = driver.find_element(By.CLASS_NAME, "geetest_slice")
        
        # 下载图片
        bg_url = bg_img.get_attribute("src")
        slice_url = slice_img.get_attribute("src")
        
        bg_response = requests.get(bg_url)
        slice_response = requests.get(slice_url)
        
        # 转换为OpenCV格式
        bg_array = np.asarray(bytearray(bg_response.content), dtype=np.uint8)
        slice_array = np.asarray(bytearray(slice_response.content), dtype=np.uint8)
        
        bg_cv = cv2.imdecode(bg_array, cv2.IMREAD_COLOR)
        slice_cv = cv2.imdecode(slice_array, cv2.IMREAD_COLOR)
        
        # 计算缺口位置
        result = cv2.matchTemplate(bg_cv, slice_cv, cv2.TM_CCOEFF_NORMED)
        min_val, max_val, min_loc, max_loc = cv2.minMaxLoc(result)
        
        # 获取缺口x坐标
        gap_x = max_loc[0]
        
        # 模拟滑动轨迹
        actions = ActionChains(driver)
        actions.click_and_hold(slider)
        
        # 生成拟人化滑动轨迹
        track = generate_track(gap_x)
        
        for move in track:
            actions.move_by_offset(move, 0)
            actions.pause(0.001)
        
        actions.release().perform()
        
        time.sleep(2)
        
    except Exception as e:
        print(f"处理验证码时出错: {e}")
    finally:
        driver.quit()

def generate_track(distance):
    """生成拟人化滑动轨迹"""
    track = []
    current = 0
    mid = distance * 3/5
    t = 0.2
    v = 0
    
    while current < distance:
        if current < mid:
            a = 2
        else:
            a = -3
            
        v0 = v
        v = v0 + a * t
        move = v0 * t + 0.5 * a * t * t
        current += move
        track.append(round(move))
    
    # 微调
    overshoot = current - distance
    track.append(-round(overshoot))
    
    return track

if __name__ == "__main__":
    handle_slider_captcha()

这个方案的关键点:

  1. 使用Selenium控制浏览器获取验证码图片
  2. 通过OpenCV的模板匹配找到缺口位置
  3. 生成拟人化的滑动轨迹模拟真人操作
  4. 使用ActionChains执行精确的滑动操作

注意实际应用中可能需要调整轨迹生成算法和等待时间,因为不同网站的验证码机制可能略有差异。

总结:用Selenium+OpenCV模拟滑动轨迹破解验证码。


浏览器无痕模式看看,要是不行就是 IP 黑名单了。

回到顶部