Python Selenium自动化访问ChatGPT的实战指南与避坑技巧

3次阅读
没有评论

共计 2410 个字符,预计需要花费 7 分钟才能阅读完成。

image.webp

背景与痛点

在自动化访问 ChatGPT 的过程中,开发者常遇到几个核心问题。这些问题不仅影响脚本的稳定性,还可能触发平台的反爬机制,导致访问受限。

Python Selenium 自动化访问 ChatGPT 的实战指南与避坑技巧

  • 验证码拦截 :ChatGPT 会针对异常访问行为弹出 reCAPTCHA 等验证码,传统自动化工具难以处理
  • 动态元素加载 :页面采用 React 等前端框架,元素加载时机不固定
  • 会话管理复杂 :登录状态保持困难,频繁重新登录易被风控
  • 反爬策略严格 :请求频率、鼠标轨迹等行为检测机制完善

技术选型对比

工具 优点 缺点 ChatGPT 适用性
Selenium 生态成熟,多语言支持 执行速度较慢 ★★★★☆
Playwright 跨浏览器支持好,速度快 新工具社区资源较少 ★★★★☆
Puppeteer 对 Chromium 优化最好 仅限 JavaScript 生态 ★★★☆☆

核心实现细节

验证码处理方案

  1. 人工干预法 :设置足够长的超时时间,手动处理首次验证
  2. cookies 复用 :保存已登录的 cookies 避免重复验证
  3. 第三方服务 :集成 2captcha 等验证码识别 API(需注意合规性)

动态元素等待策略

# 显式等待最佳实践
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.common.by import By
from selenium.webdriver.support import expected_conditions as EC

wait = WebDriverWait(driver, 30)
textarea = wait.until(EC.presence_of_element_located((By.CSS_SELECTOR, "textarea#prompt-textarea"))
)

会话管理技巧

  • 使用 profile 目录保持登录状态
  • 定期刷新 cookies 防止过期
  • 多账号轮换降低单个账号风险

完整代码示例

import time
from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.chrome.options import Options

# 配置 Chrome 选项
chrome_options = Options()
chrome_options.add_argument("--user-data-dir=./chrome_profile")
chrome_options.add_argument("--disable-blink-features=AutomationControlled")

# 初始化驱动
service = Service(executable_path="./chromedriver")
driver = webdriver.Chrome(service=service, options=chrome_options)

try:
    # 访问 ChatGPT
    driver.get("https://chat.openai.com")

    # 等待页面加载
    time.sleep(5)  # 初始加载等待

    # 检测是否出现验证码
    if "verify" in driver.current_url:
        print("请手动完成验证码验证")
        while "verify" in driver.current_url:
            time.sleep(1)

    # 定位输入框
    prompt_area = driver.find_element(By.CSS_SELECTOR, "textarea#prompt-textarea")
    prompt_area.send_keys("Hello ChatGPT")

    # 提交问题
    submit_btn = driver.find_element(By.CSS_SELECTOR, "button[data-testid='send-button']"
    )
    submit_btn.click()

    # 等待响应
    response_locator = (By.CSS_SELECTOR, "div[class*='markdown']")
    WebDriverWait(driver, 60).until(EC.presence_of_element_located(response_locator)
    )

    # 获取响应内容
    responses = driver.find_elements(*response_locator)
    print(responses[-1].text)

finally:
    driver.quit()

性能与安全性考量

优化建议

  1. 资源加载控制
    chrome_options.add_argument("--blink-settings=imagesEnabled=false")
    chrome_options.add_argument("--disable-extensions")
  2. 请求间隔 :设置 3 - 5 秒的随机延迟避免高频请求
  3. 行为模拟
    from selenium.webdriver.common.action_chains import ActionChains
    
    actions = ActionChains(driver)
    actions.move_to_element(element).pause(1).click().perform()

反爬规避

  • 定期更换 User-Agent
  • 使用住宅代理 IP
  • 避免固定操作模式

生产环境避坑指南

  1. 验证码频繁出现
  2. 解决方案:降低操作频率,使用真实用户行为模式

  3. 会话突然终止

  4. 解决方案:实现自动重连机制,监控网络状态

  5. 元素定位失败

  6. 解决方案:使用多种定位策略组合,如 XPath 和 CSS 选择器备用

  7. 性能下降

  8. 解决方案:定期清理缓存,使用无头模式减少资源消耗

扩展方向

可以尝试实现以下高级功能:

  • 多账号自动切换系统
  • 对话上下文保持
  • 自动解析响应内容
  • 异常自动恢复机制

期待大家在评论区分享自己的实现经验和优化方案。

正文完
 0
评论(没有评论)