You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Selenium/undetected_chromedriver爬取ChatGPT:人机验证点击/绕过方案求助

解决OpenAI Cloudflare人机验证元素定位失败及点击问题

核心原因

你的代码使用普通webdriver.Chrome,会被Cloudflare的反爬机制识别为自动化工具,导致验证组件加载异常或元素定位规则被干扰,最终触发TimeoutException。

具体修复方案

1. 切换到undetected_chromedriver

这是绕开Cloudflare检测的关键,该库会修改Chrome的特征值,避免被识别:

import time
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.common.by import By
from selenium.webdriver.support import expected_conditions as EC
import undetected_chromedriver as uc

# 初始化undetected_chromedriver(无需手动指定chromedriver路径)
driver = uc.Chrome()
driver.get('https://chat.openai.com/chat')

2. 调整元素定位逻辑

Cloudflare的验证元素class可能动态更新,建议使用更稳定的定位方式:

  • 优先通过复选框关联的label定位(可点击区域通常是label):
wait = WebDriverWait(driver, 30)
# 等待可点击的验证区域出现
verify_element = wait.until(EC.element_to_be_clickable((By.CSS_SELECTOR, "label[for^='cf-checkbox']")))
  • 若元素在iframe中(极少情况,但需排查),先切换iframe再定位:
# 切换到Cloudflare验证iframe
iframe = wait.until(EC.presence_of_element_located((By.CSS_SELECTOR, "iframe[title*='Cloudflare']")))
driver.switch_to.frame(iframe)
# 定位验证元素
verify_element = wait.until(EC.element_to_be_clickable((By.CSS_SELECTOR, "label.ctp-checkbox-label")))
# 操作完成后切回主文档
driver.switch_to.default_content()

3. 验证框点击方法

找到元素后,优先使用原生click(),若出现点击无响应(JS事件拦截),改用JavaScript点击:

# 常规点击
verify_element.click()

# 备选方案:JS强制点击
driver.execute_script("arguments[0].click();", verify_element)

额外提示

  • 移除固定time.sleep(),全部用WebDriverWait显式等待,适配不同网络加载速度。
  • 确保undetected_chromedriver版本与本地Chrome版本一致,否则会启动失败。
  • Cloudflare验证逻辑会持续更新,若定位失效,需用浏览器F12开发者工具重新查看最新元素结构。

内容的提问来源于stack exchange,提问作者zurich_ruby

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.28 00:47:21