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()
这个方案的关键点:
- 使用Selenium控制浏览器获取验证码图片
- 通过OpenCV的模板匹配找到缺口位置
- 生成拟人化的滑动轨迹模拟真人操作
- 使用ActionChains执行精确的滑动操作
注意实际应用中可能需要调整轨迹生成算法和等待时间,因为不同网站的验证码机制可能略有差异。
总结:用Selenium+OpenCV模拟滑动轨迹破解验证码。
浏览器无痕模式看看,要是不行就是 IP 黑名单了。

