基于Python的淘宝评论爬虫

基于 Python 实现的淘宝商品评论爬虫,核心目标是爬取指定淘宝商品的评论数据(评论内容、评分、买家昵称、评论时间等),并保证代码可运行、易理解,同时适配淘宝的反爬机制。

实现思路

  1. 接口分析 :淘宝评论数据通过 Ajax 异步加载,可通过抓包获取评论接口(淘宝评论接口需携带 _ksTScallback 等动态参数,核心依赖商品 ID 和页码);
  2. 请求构造:模拟浏览器请求头,添加 Cookie(需手动登录获取)、User-Agent 等关键参数,绕过基础反爬;
  3. 数据解析:处理返回的 JSONP 格式数据,提取核心评论字段;
  4. 数据保存:将爬取结果保存为 CSV 文件,方便后续分析;
  5. 异常处理:添加请求超时、数据解析失败等异常捕获,保证爬虫稳定性;
  6. 反爬适配:添加随机延时,避免请求频率过高导致账号 / IP 被限制。

前置准备

  1. 安装依赖库

    pip install requests json5 pandas

  2. 获取淘宝 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}")

代码关键说明

  1. 商品 ID 获取 :淘宝商品链接格式为 https://item.taobao.com/item.htm?id=690907351225,其中 690907351225 就是商品 ID。
  2. Cookie 重要性:淘宝评论接口必须携带登录后的 Cookie,否则会返回 403 / 登录提示,Cookie 有效期约 1-3 天,过期后需重新复制。
  3. 核心参数解析
    • rateType:控制评论类型(空 = 全部、1 = 好评、2 = 中评、3 = 差评);
    • orderTypesort_weight= 综合排序,create= 最新评论;
    • _ksTS:动态时间戳 + 随机数,是淘宝反爬的基础参数,需实时生成。
  4. 数据解析 :淘宝返回的是 JSONP 格式(带回调函数),且部分字段是非标准 JSON(如末尾逗号),因此用 json5 库解析更稳定。
  5. 反爬注意
    • 单次爬取页数建议不超过 20 页,避免触发风控;
    • 延时设置为 2-5 秒,不要缩短;
    • 若出现「登录验证」提示,需手动登录淘宝后重新复制 Cookie。

常见问题解决

  1. Cookie 过期:重新登录淘宝,复制最新的 Cookie 替换配置项;
  2. 403 Forbidden:检查 User-Agent、Referer 是否正确,或 IP 被限制(换网络 / 使用代理);
  3. 数据为空:确认商品 ID 正确,或该商品评论页数不足设置的 PAGE_NUM。

总结

  1. 该爬虫核心依赖登录后的 Cookie,是突破淘宝反爬的关键;
  2. 通过解析淘宝官方评论接口,高效获取评论数据并保存为 CSV;
  3. 仅可用于学习和个人数据分析,禁止商用(淘宝平台禁止未经授权爬取数据);
  4. 若需爬取多商品 / 大量数据,建议添加代理 IP 池、Cookie 池等进阶反爬适配。
相关推荐
这里是彪彪1 天前
Java多线程中的单例模式
java·开发语言·单例模式
小途软件1 天前
基于深度学习的人脸属性增强器
java·人工智能·pytorch·python·深度学习·语言模型
linzihahaha1 天前
C++ 单例模式总结
开发语言·c++·单例模式
Lancer-311 天前
打开JAVA控制台(Java control panel )
java·开发语言
Hcoco_me1 天前
大模型面试题46:在训练7B LLM时,如果使用AdamW优化器,那么它需要的峰值显存是多少?
开发语言·人工智能·深度学习·transformer·word2vec
ai_top_trends1 天前
AI 生成工作计划 PPT 是否适合年初规划与年度汇报
人工智能·python·powerpoint
半夏知半秋1 天前
rust学习-Option与Result
开发语言·笔记·后端·学习·rust
天才测试猿1 天前
自动化测试基础知识总结
自动化测试·软件测试·python·测试工具·程序人生·职场和发展·测试用例
淺川之夏1 天前
abstract 类,里面引用@Autowired ,使用注入类的方法,报空指针异常
java·开发语言