先展示一下爬虫成果
在电商数据分析、用户体验优化、竞品调研等场景中,商品评论数据是极具价值的信息来源。本文将通过实战演示,介绍如何使用 Python 爬虫技术获取淘宝 / 天猫商品评论,并将其封装为可调用的 API 接口,实现数据的高效获取与共享。
一、技术栈准备
核心工具与库
- requests:HTTP 请求处理
- BeautifulSoup:HTML 解析(备用,实际通过接口获取 JSON 数据)
- Flask:轻量级 Web 框架,用于 API 开发
- fake_useragent:生成随机 User-Agent,绕过简单反爬
- pandas:数据清洗与结构化处理
反爬必备
- 代理 IP 池(示例使用公开代理,生产环境建议使用付费代理)
- Cookie 管理(保持用户会话状态)
- 随机请求间隔(模拟真实用户行为)
二、爬虫核心逻辑实现
1. 分析评论接口
通过浏览器开发者工具(F12)抓包发现,淘宝 / 天猫商品评论通过以下接口加载:
https://rate.tmall.com/list_detail_rate.htm?itemId=商品ID&spuId=SPUID&sellerId=店铺ID&order=3¤tPage=页码&append=0&content=1&tagId=&posi=&picture=&groupId=&callback=jsonp100
关键参数:
- itemId:商品 ID(从商品详情页 URL 获取,如商品详情中的123456)
- currentPage:页码,从 1 开始
2. 构建请求头
模拟浏览器请求头,包含随机 User-Agent 和必要 Cookie(通过登录态获取,演示使用公共 Cookie):
from fake_useragent import UserAgent
def get_headers():
ua = UserAgent()
headers = {
"User-Agent": ua.random,
"Cookie": "your_cookie_here", # 需替换为有效Cookie(可通过浏览器登录后获取)
"Referer": "https://detail.tmall.com/item.htm",
"Host": "rate.tmall.com"
}
return headers
3. 评论数据抓取函数
处理分页请求并解析 JSON 数据,提取核心字段(评论内容、评分、用户昵称、评论时间等):
import requests
import json
def crawl_comments(item_id, page=1):
url = f"https://rate.tmall.com/list_detail_rate.htm?itemId={item_id}¤tPage={page}"
headers = get_headers()
response = requests.get(url, headers=headers, timeout=10)
# 去除JSONP回调前缀(如"jsonp100(")并解析
data = json.loads(response.text[9:-1])
comments = data["rateDetail"]["rateList"]
result = []
for comment in comments:
result.append({
"user": comment["displayUserNick"],
"score": comment["rateLevel"], # 评分(1-5分)
"content": comment["rateContent"],
"time": comment["rateDate"],
"images": [img["url"] for img in comment.get("picList", [])] # 评论图片
})
return result
三、封装 API 接口(Flask 实现)
1. 创建 API 服务
from flask import Flask, jsonify, request
app = Flask(__name__)
@app.route('/taobao/comments', methods=['GET'])
def get_comments():
item_id = request.args.get('item_id', type=str)
page = request.args.get('page', default=1, type=int)
if not item_id:
return jsonify({"error": "item_id is required"}), 400
try:
comments = crawl_comments(item_id, page)
return jsonify({
"status": "success",
"data": comments,
"page": page
})
except Exception as e:
return jsonify({"error": f"Request failed: {str(e)}"}), 500
if __name__ == '__main__':
app.run(host='0.0.0.0', port=5000, debug=True)
2. 接口调用示例
方式 1:HTTP 请求
curl "http://localhost:5000/taobao/comments?item_id=6234567890&page=1"
方式 2:Python 调用
import requests
url = "http://localhost:5000/taobao/comments"
params = {"item_id": "6234567890", "page": 1}
response = requests.get(url, params=params)
print(response.json())
3. 返回数据格式
{
"status": "success",
"data": [
{
"user": "用户昵称",
"score": 5,
"content": "商品质量很好,物流也很快!",
"time": "2023-10-01 15:30:00",
"images": ["http://example.com/image1.jpg", "http://example.com/image2.jpg"]
}
],
"page": 1
}
四、反爬与稳定性优化
1. 代理 IP 轮换
使用代理 IP 池(如requests-proxies库):
proxies = {
"http": "http://proxy.example.com:8080",
"https": "https://proxy.example.com:8080"
}
response = requests.get(url, headers=headers, proxies=proxies)
2. 随机请求间隔
避免高频请求触发反爬:
import time
import random
time.sleep(random.uniform(1, 3)) # 随机等待1-3秒
3. Cookie 管理
使用requests.Session保持会话状态,自动处理 Cookie:
session = requests.Session()
session.headers.update(get_headers())
五、合规性与注意事项
- 反爬限制:淘宝天猫反爬机制严格,建议:
-
- 控制请求频率(每分钟不超过 10 次)
-
- 使用真实浏览器环境(配合 Selenium/Playwright)
-
- 购买商业级代理 IP(如阿布云、小象代理)
- 数据用途:仅限合法商业分析,禁止滥用或公开传播用户隐私信息
- 动态页面处理:若接口返回数据加密,需逆向分析加密参数(如sec_token)
六、扩展应用
- 数据存储:将评论数据存入 MySQL/Elasticsearch,支持历史数据查询
- 情感分析:结合 NLTK / 哈工大 LTP 进行评论情感极性判断
- 可视化:通过 Grafana/Power BI 生成评论关键词云、评分分布图
通过以上步骤,我们成功实现了从淘宝天猫商品评论爬取到 API 封装的完整流程。实际应用中,需根据平台反爬策略动态调整爬虫逻辑,并始终遵守网站的开发者协议。技术演进方向可关注无头浏览器(Puppeteer)、分布式爬虫(Scrapy+Redis)和 AI 反反爬技术,提升数据获取的稳定性与效率。