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
相关产品推荐
相关产品推荐

