题目
使用Python爬取动态加载的评论数据
信息
- 类型:问答
- 难度:⭐⭐
考点
动态网页爬取, AJAX请求分析, JSON数据处理
快速回答
实现步骤:
- 使用浏览器开发者工具分析AJAX请求
- 通过Requests库模拟真实请求头
- 构造分页参数获取JSON数据
- 解析JSON提取目标字段
- 添加异常处理和延时避免封禁
问题场景
某电商网站商品评论数据通过AJAX动态加载,初始HTML中不包含评论内容。需爬取前5页评论的用户名、评分和内容。
核心步骤
1. 分析请求
在Chrome开发者工具中:
- 打开Network面板 → 筛选XHR请求
- 滚动页面触发评论加载,找到类似
product_reviews?page=2的请求 - 检查Request Headers中的
User-Agent和Referer - 查看Response数据结构(通常为JSON)
2. 代码实现
import requests
import time
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36',
'Referer': 'https://www.example.com/product/123'
}
for page in range(1, 6):
try:
# 构造带分页参数的URL
url = f'https://api.example.com/reviews?product_id=123&page={page}'
response = requests.get(url, headers=headers, timeout=10)
response.raise_for_status() # 检查HTTP错误
data = response.json()
for review in data['reviews']:
print(f"用户: {review['user_name']}")
print(f"评分: {review['rating']}/5")
print(f"内容: {review['content'][:50]}...\n")
time.sleep(1.5) # 请求间隔
except requests.exceptions.RequestException as e:
print(f"第{page}页请求失败: {e}")
except KeyError:
print(f"第{page}页JSON结构异常")关键原理
- 动态加载机制:现代网站常用JavaScript发起AJAX请求获取数据
- JSON优势:相比解析HTML,直接处理JSON更高效稳定
- 反爬策略:请求头模拟和延时可降低被封风险
最佳实践
- 始终添加
User-Agent和Referer头部 - 使用
timeout参数防止请求阻塞 - 设置
try-except捕获网络和解析异常 - 遵守
robots.txt并控制请求频率(≥1秒/次)
常见错误
| 错误类型 | 现象 | 解决方案 |
|---|---|---|
| 未模拟请求头 | 返回403禁止访问 | 添加完整headers |
| 忽略分页参数 | 重复获取第一页数据 | 分析URL/page参数规律 |
| 无异常处理 | 网络波动导致程序崩溃 | 添加try-except块 |
扩展知识
- 高级反爬:当遇到验证码时需使用Selenium或Playwright
- 数据存储:可结合SQLite/MongoDB持久化数据
- 效率优化:使用aiohttp实现异步请求提升速度
- 法律风险:避免爬取个人隐私数据,遵守网站条款