共计 1659 个字符,预计需要花费 5 分钟才能阅读完成。
背景与痛点
ChatGPT 作为基于浏览器的交互式应用,其内容动态加载、反爬机制严格的特点使得传统爬虫难以直接获取数据。主要难点包括:

- 动态内容加载 :聊天内容通过 JavaScript 动态渲染,普通 HTTP 请求无法捕获
- 反爬机制 :包括验证码、请求频率限制、行为检测等
- 会话管理 :需要维持登录状态,处理超时和重新认证
技术选型
常见浏览器自动化工具对比:
- Selenium:
- 优点:社区支持完善,兼容多种浏览器
-
缺点:执行速度较慢
-
Playwright:
- 优点:支持多浏览器,执行效率高
- 缺点:较新,社区资源相对较少
选择 WebDriver 的原因:
- 成熟稳定,适合新手入门
- 丰富的文档和社区支持
- 灵活的浏览器控制能力
核心实现
环境准备
# 安装必要库
pip install selenium webdriver-manager
基础爬取代码
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 webdriver_manager.chrome import ChromeDriverManager
# 初始化 WebDriver
driver = webdriver.Chrome(ChromeDriverManager().install())
try:
# 访问 ChatGPT
driver.get('https://chat.openai.com/')
# 等待登录完成(手动)input('请手动登录后按回车继续...')
# 定位输入框
text_area = WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.TAG_NAME, 'textarea'))
)
# 输入问题
text_area.send_keys('Python WebDriver 如何爬取动态内容?')
# 定位发送按钮并点击
send_button = driver.find_element(By.CSS_SELECTOR, 'button[data-testid="send-button"]'
)
send_button.click()
# 等待响应
response = WebDriverWait(driver, 30).until(EC.presence_of_element_located((By.CSS_SELECTOR, 'div[class*="markdown"]'))
)
# 获取响应内容
print(response.text)
finally:
driver.quit()
反爬对策
- 模拟人类行为 :
- 随机延迟(0.5- 3 秒)
- 模拟鼠标移动轨迹
-
随机滚动页面
-
验证码处理 :
- 使用第三方验证码识别服务
-
手动干预模式(如上例中的 input 暂停)
-
请求优化 :
- 控制请求频率(每分钟不超过 3 - 5 次)
- 使用代理 IP 轮换
- 合理设置超时时间
法律与伦理
重要注意事项:
- 严格遵守 ChatGPT 的服务条款
- 避免大规模爬取造成服务压力
- 不将爬取内容用于商业用途
- 尊重知识产权和隐私保护
避坑指南
常见问题及解决方案:
- 元素定位失败 :
- 使用显式等待(WebDriverWait)
-
尝试多种定位方式(XPath/CSS 选择器)
-
会话超时 :
- 定期刷新页面
-
实现自动重新登录
-
响应缓慢 :
- 调整等待超时时间
- 检查网络连接
互动与扩展
建议尝试的扩展方向:
- 实现多账号轮换
- 添加自动保存对话历史功能
- 结合 OCR 技术处理验证码
- 使用多线程提高效率(需谨慎控制频率)
欢迎在评论区分享你的实现经验和遇到的问题!
结语
通过本文介绍的方法,你可以相对稳定地获取 ChatGPT 的对话内容,但请始终牢记技术伦理和法律边界。WebDriver 爬虫技术是一把双刃剑,合理使用才能发挥其最大价值。随着 ChatGPT 反爬机制的不断升级,爬取方案也需要持续优化,保持技术敏感度很重要。
正文完
