基于 Python 实现的淘宝商品评论爬虫,核心目标是爬取指定淘宝商品的评论数据(评论内容、评分、买家昵称、评论时间等),并保证代码可运行、易理解,同时适配淘宝的反爬机制。
实现思路
- 接口分析 :淘宝评论数据通过 Ajax 异步加载,可通过抓包获取评论接口(淘宝评论接口需携带
_ksTS、callback等动态参数,核心依赖商品 ID 和页码); - 请求构造:模拟浏览器请求头,添加 Cookie(需手动登录获取)、User-Agent 等关键参数,绕过基础反爬;
- 数据解析:处理返回的 JSONP 格式数据,提取核心评论字段;
- 数据保存:将爬取结果保存为 CSV 文件,方便后续分析;
- 异常处理:添加请求超时、数据解析失败等异常捕获,保证爬虫稳定性;
- 反爬适配:添加随机延时,避免请求频率过高导致账号 / IP 被限制。
前置准备
-
安装依赖库:
pip install requests json5 pandas
-
获取淘宝 Cookie :
- 打开淘宝商品页,登录账号;
- 按 F12 打开开发者工具 → 切换到「网络」标签 → 刷新页面,筛选「XHR」请求;
- 找到任意评论相关请求,复制其「Cookie」字段(完整复制,这是爬虫能正常请求的核心)。
完整代码
import requests
import json5
import csv
import time
import random
from urllib.parse import urlencode
# -------------------------- 配置项 --------------------------
ITEM_ID = "690907351225" # 淘宝商品ID(从商品链接中提取)
PAGE_NUM = 5 # 要爬取的评论页数(淘宝单页20条评论)
CSV_FILE = "taobao_comments.csv" # 保存评论的CSV文件名
# 替换为你自己的淘宝Cookie(必须!否则请求会被拦截)
COOKIE = "你的淘宝Cookie,完整复制"
# -------------------------- 请求头配置 --------------------------
HEADERS = {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36",
"Cookie": COOKIE,
"Referer": f"https://item.taobao.com/item.htm?id={ITEM_ID}",
"Accept": "application/json, text/javascript, */*; q=0.01",
"Accept-Language": "zh-CN,zh;q=0.9",
"X-Requested-With": "XMLHttpRequest",
"Connection": "keep-alive"
}
def get_taobao_comments(item_id, page):
"""
获取单页淘宝评论数据
:param item_id: 商品ID
:param page: 页码
:return: 评论列表(字典格式)
"""
# 构造动态参数(_ksTS 是时间戳+随机数,callback 是固定格式)
timestamp = str(int(time.time() * 1000))
random_str = str(random.randint(100, 999))
_ksTS = f"{timestamp}_{random_str}"
callback = f"jsonp{random.randint(100000, 999999)}"
# 淘宝评论接口参数
params = {
"callback": callback,
"ajax": "true",
"m": "customized",
"platelet": "true",
"productId": item_id,
"page": page,
"pageSize": 20,
"rateType": "", # 空=全部评论,1=好评,2=中评,3=差评
"orderType": "sort_weight", # sort_weight=综合排序,create=最新排序
"showContent": "true",
"_ksTS": _ksTS,
"defaultSearch": "ppctag",
"isInner": "false"
}
# 评论接口URL
url = f"https://rate.taobao.com/feedRateList.htm?{urlencode(params)}"
try:
# 发送请求(添加超时控制)
response = requests.get(url, headers=HEADERS, timeout=15)
response.raise_for_status() # 抛出HTTP错误(如403/500)
# 处理JSONP数据:去掉回调函数包裹,提取核心JSON
json_data_str = response.text.lstrip(f"{callback}(").rstrip(");")
# 使用json5解析(兼容淘宝返回的非标准JSON)
data = json5.loads(json_data_str)
# 提取评论数据
comments = []
if "comments" in data and data["comments"]:
for comment in data["comments"]:
comment_info = {
"买家昵称": comment.get("nick", ""),
"评论内容": comment.get("content", "").replace("\n", "").strip(),
"评分": comment.get("rate", 0),
"评论时间": comment.get("date", ""),
"点赞数": comment.get("useful", 0),
"追评内容": comment.get("appendComment", {}).get("content", "").replace("\n", "").strip(),
"追评时间": comment.get("appendComment", {}).get("date", "")
}
comments.append(comment_info)
return comments
except requests.exceptions.RequestException as e:
print(f"第{page}页请求失败:{e}")
return []
except json5.JSON5DecodeError as e:
print(f"第{page}页数据解析失败(可能Cookie过期):{e}")
return []
except Exception as e:
print(f"第{page}页未知错误:{e}")
return []
def save_to_csv(comments, file_path):
"""
将评论数据保存为CSV文件(UTF-8编码,避免中文乱码)
"""
if not comments:
return
# 表头(与评论字典的key对应)
headers = ["买家昵称", "评论内容", "评分", "评论时间", "点赞数", "追评内容", "追评时间"]
# 追加模式写入,避免覆盖
with open(file_path, "a", encoding="utf-8-sig", newline="") as f:
writer = csv.DictWriter(f, fieldnames=headers)
# 若文件为空,先写表头
if f.tell() == 0:
writer.writeheader()
writer.writerows(comments)
if __name__ == "__main__":
print(f"开始爬取淘宝商品{ITEM_ID}的评论,共{PAGE_NUM}页...")
# 清空原有CSV文件(可选)
with open(CSV_FILE, "w", encoding="utf-8-sig", newline="") as f:
pass
total = 0
for page in range(1, PAGE_NUM + 1):
print(f"正在爬取第{page}页...")
comments = get_taobao_comments(ITEM_ID, page)
if comments:
save_to_csv(comments, CSV_FILE)
total += len(comments)
print(f"第{page}页爬取成功,共{len(comments)}条评论")
else:
print(f"第{page}页无有效评论(可能Cookie过期/页数超限)")
# 随机延时2-5秒,避免请求过快被封
time.sleep(random.uniform(2, 5))
print(f"\n爬取完成!共获取{total}条评论,已保存至 {CSV_FILE}")
代码关键说明
- 商品 ID 获取 :淘宝商品链接格式为
https://item.taobao.com/item.htm?id=690907351225,其中690907351225就是商品 ID。 - Cookie 重要性:淘宝评论接口必须携带登录后的 Cookie,否则会返回 403 / 登录提示,Cookie 有效期约 1-3 天,过期后需重新复制。
- 核心参数解析 :
rateType:控制评论类型(空 = 全部、1 = 好评、2 = 中评、3 = 差评);orderType:sort_weight= 综合排序,create= 最新评论;_ksTS:动态时间戳 + 随机数,是淘宝反爬的基础参数,需实时生成。
- 数据解析 :淘宝返回的是 JSONP 格式(带回调函数),且部分字段是非标准 JSON(如末尾逗号),因此用
json5库解析更稳定。 - 反爬注意 :
- 单次爬取页数建议不超过 20 页,避免触发风控;
- 延时设置为 2-5 秒,不要缩短;
- 若出现「登录验证」提示,需手动登录淘宝后重新复制 Cookie。
常见问题解决
- Cookie 过期:重新登录淘宝,复制最新的 Cookie 替换配置项;
- 403 Forbidden:检查 User-Agent、Referer 是否正确,或 IP 被限制(换网络 / 使用代理);
- 数据为空:确认商品 ID 正确,或该商品评论页数不足设置的 PAGE_NUM。
总结
- 该爬虫核心依赖登录后的 Cookie,是突破淘宝反爬的关键;
- 通过解析淘宝官方评论接口,高效获取评论数据并保存为 CSV;
- 仅可用于学习和个人数据分析,禁止商用(淘宝平台禁止未经授权爬取数据);
- 若需爬取多商品 / 大量数据,建议添加代理 IP 池、Cookie 池等进阶反爬适配。