共计 2748 个字符,预计需要花费 7 分钟才能阅读完成。
背景与痛点分析
ChatGPT 作为当前最热门的 AI 对话服务,其数据对开发者有很高的研究价值。但直接爬取会遇到几个典型问题:

- 动态内容加载:ChatGPT 页面大量使用 JavaScript 动态渲染,传统 requests 库无法获取完整 DOM
- 严格的反爬机制:包括请求频率检测、行为指纹识别、IP 封锁等
- API 访问限制:官方 API 有严格的调用限制和认证要求
- 交互式对话特性:需要维持会话状态才能获取连续响应
技术选型对比
针对上述特点,我们比较三种常用工具:
- Requests+BeautifulSoup:适合静态页面,但无法处理动态内容
- Selenium:能完整模拟浏览器环境,但执行效率较低
- Scrapy+Playwright:折中方案,适合大规模爬取
对于新手建议从 Selenium 开始,虽然性能不是最优,但调试直观且能应对大部分反爬场景。
核心实现步骤
1. 环境配置
先安装必要依赖:
pip install selenium webdriver-manager
2. Selenium 基础操作
使用 Headless 模式启动浏览器:
from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from webdriver_manager.chrome import ChromeDriverManager
options = webdriver.ChromeOptions()
options.add_argument('--headless') # 无头模式
options.add_argument('--disable-gpu')
driver = webdriver.Chrome(service=Service(ChromeDriverManager().install()),
options=options
)
3. 处理动态加载
ChatGPT 的消息内容通常出现在特定 DOM 节点下,使用 XPath 定位:
def get_chat_response(driver):
# 等待消息加载完成
WebDriverWait(driver, 10).until(
EC.presence_of_element_located((By.XPATH, '//div[contains(@class,"markdown")]')
)
)
return driver.find_element(By.XPATH, '//div[contains(@class,"markdown")]'
).text
4. 反爬策略应对
关键防护措施:
-
请求头伪装
headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64)', 'Accept-Language': 'en-US,en;q=0.9' } -
行为模拟
# 随机化操作间隔 time.sleep(random.uniform(1, 3)) -
IP 轮换方案
PROXY = "http://user:pass@proxy_ip:port" options.add_argument(f'--proxy-server={PROXY}')
完整代码示例
import time
import random
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
class ChatGPTScraper:
def __init__(self):
self.driver = self._init_driver()
def _init_driver(self):
options = webdriver.ChromeOptions()
options.add_argument('--headless')
options.add_argument('user-agent=Mozilla/5.0...')
return webdriver.Chrome(options=options)
def get_response(self, prompt):
try:
self.driver.get("https://chat.openai.com")
# 实际项目中需要处理登录等流程
input_box = WebDriverWait(self.driver, 10).until(EC.presence_of_element_located((By.TAG_NAME, "textarea"))
)
input_box.send_keys(prompt)
input_box.submit()
return self._wait_for_response()
except Exception as e:
print(f"Error: {e}")
return None
def _wait_for_response(self):
WebDriverWait(self.driver, 30).until(
EC.presence_of_element_located((By.XPATH, '//div[starts-with(@class,"markdown")]')
)
)
return self.driver.find_element(By.XPATH, '//div[starts-with(@class,"markdown")]'
).text
# 使用示例
scraper = ChatGPTScraper()
print(scraper.get_response("Python 爬虫最佳实践"))
性能优化建议
- 并发控制:使用 Selenium Grid 分布式执行
- 缓存机制:对相同提问缓存响应结果
- 请求合并:批量提交问题减少交互次数
- 资源复用:保持浏览器会话避免重复登录
常见问题解决
- 元素定位失败 :增加显式等待时间,检查 iframe 嵌套
- 验证码出现 :考虑接入打码平台服务
- IP 被封禁 :使用高质量代理 IP 池
- 会话超时 :实现自动重新登录机制
合规性提醒
- 严格遵守 robots.txt 规定
- 控制请求频率(建议 <5 次 / 分钟)
- 仅用于学习研究目的
- 避免爬取隐私数据
进一步思考
更复杂的反爬机制可能包括:
– 鼠标移动轨迹分析
– Canvas 指纹识别
– WebGL 渲染特征检测
如何应对这些高级防护?可以考虑:
1. 使用 Playwright 更精准模拟人类操作
2. 分析前端加密逻辑逆向 API 调用
3. 通过浏览器自动化工具生成真实指纹
希望这篇指南能帮助大家安全合规地获取所需数据。如果遇到新问题,欢迎在评论区交流解决方案!
正文完
