Python 采集亚马逊评论完整指南:CSRF 令牌获取与 Cookie 池管理实践

本文涉及的开源项目地址:https://github.com/zhuojiuya/Amazon-Review


前言

在做亚马逊评论数据采集时,开发者通常会遇到两个棘手问题:

  1. 新账号无法查看评论:账号无购买记录时,评论区内容被隐藏或限制
  2. 频繁翻页触发封控:高频访问评论区会触发 CAPTCHA 验证或临时封禁账号

本文记录一套完整的评论数据采集方案,包含可视化平台和 Python SDK 两种接入方式,重点介绍 Cookie 池管理、CSRF 令牌获取与并发任务调度的工程实现。


一、核心技术难点分析

1.1 亚马逊评论页的访问限制机制

亚马逊针对评论页有以下防护策略:

  • 未登录或新账号:评论内容部分或全部隐藏
  • 短时间内高频翻页:触发滑块验证或 IP 限速
  • 账号无购买记录:部分站点评论区不可见

1.2 CSRF 令牌机制

亚马逊评论接口采用 CSRF 令牌保护,每次请求前需先从商品页提取有效令牌。令牌与 Cookie 绑定,Cookie 失效时令牌同步失效。

常见失败场景:

  • 返回 HTTP 200 但页面无 CSRF 令牌 → Cookie 已被软封,需更换
  • 返回 4xx/5xx → 网络或代理问题
  • 令牌提取后短期内失效 → Cookie 被平台检测为异常

1.3 Cookie 池的必要性

单个 Cookie 频繁请求极易触发限制,Cookie 池通过以下策略提升稳定性:

  • 独占锁:同一时间一个 Cookie 只分配给一个任务
  • 临时锁定:Cookie 出现 200 无令牌时锁定 N 分钟后再用
  • 自动禁用:累计 404 超过阈值自动下架
  • LRU 分配:优先使用最久未用的 Cookie,均衡使用频率

二、方案一:可视化平台(无代码)

适合不写代码的运营和选品人员。平台地址:www.reveyes.cn,注册后即可使用,新用户有体验积分。

2.1 添加采集任务

在「ASIN 管理」页面填写参数后提交,系统自动排队处理:

参数 可选值 说明
marketplace US / UK / DE 等 19 个站点
pages 1~50 每页约 10 条,按实际页数计费
filter_star all_stars positive critical five_star critical = 差评(1-3星)
filter_sort_by recent / helpful
filter_reviewer_type all_reviews / avp_only_reviews 后者仅已验证购买
filter_media_type all_contents / with_reviews 后者仅含图片/视频

支持 Excel 模板批量导入,单次最多 50 个 ASIN。

2.2 查看评论与 AI 分析

采集完成后可直接查看原始评论(支持按星级、关键词、日期过滤,可导出 CSV),也可触发 AI 分析,自动生成结构化报告:

  • 情感分布(好评/中性/差评占比及趋势)
  • 核心优缺点(附评论原文证据溯源)
  • 用户画像与购买动机分析
  • 产品改进建议与 Listing 优化方向
  • 广告投放关键词推荐

报告可一键生成分享链接,发给同事或客户直接查看,无需登录。

2.3 差评监控

添加监控任务后,系统按设定频率自动拉取新评论,出现差评实时推送通知。


三、方案二:Python SDK 接入

3.1 安装

pip install reveyes

依赖仅 requests,支持 Python 3.8+。

3.2 鉴权配置

在 reveyes.cn 控制台的「Open API」页面创建 API Key:

import os
from reveyes import ReveyesClient

client = ReveyesClient(api_key=os.environ["REVEYES_API_KEY"])

3.3 提交采集任务

task = client.fetch_reviews([
    {
        "asin": "B08G4CC41H",
        "marketplace": "US",
        "pages": 5,
        "filter_star": "critical",
        "filter_sort_by": "recent",
        "filter_reviewer_type": "avp_only_reviews",
    },
    {
        "asin": "B0BQD3TMB1",
        "marketplace": "DE",
        "pages": 3,
    },
])
print(f"task_id={task.task_id}, 预扣积分={task.pre_deduct}")

积分按页预扣,实际抓取页数少于预付时差额自动退还。

3.4 查询任务状态

task status 流转:pendingrunningdone / partial / failed

import time

while True:
    result = client.get_task_result(task.task_id)
    print(f"状态: {result.status}, 进度: {result.finished_asins}/{result.total_asins}")
    if result.status in ("done", "partial", "failed"):
        break
    time.sleep(10)

或使用阻塞式等待:

result = client.wait_for_task(task.task_id, timeout=300)
print(f"实扣积分: {result.actual_deduct}, 共 {result.reviews.total} 条评论")

3.5 迭代全量评论

for review in client.iter_all_reviews(task.task_id):
    print(review.asin, review.rating, review.review_content)

3.6 评论对象字段

review.review_id         # 亚马逊原始评论 ID
review.rating            # 1~5
review.title             # 标题
review.review_date       # "2025-03-15"
review.review_content    # 正文
review.verified_purchase # 1=已验证购买
review.helpful_votes     # 有帮助票数
review.product_variant   # 变体信息,如 "Color: Black"
review.images            # 图片 URL 列表
review.profile_url       # 评论者主页

3.7 完整示例:差评导出 CSV

import csv, os
from reveyes import ReveyesClient

client = ReveyesClient(api_key=os.environ["REVEYES_API_KEY"])

task = client.fetch_reviews([
    {"asin": "B08G4CC41H", "marketplace": "US", "pages": 10, "filter_star": "critical"}
])
client.wait_for_task(task.task_id, timeout=300)

with open("critical_reviews.csv", "w", newline="", encoding="utf-8-sig") as f:
    w = csv.writer(f)
    w.writerow(["asin", "rating", "date", "verified", "helpful_votes", "title", "content"])
    for r in client.iter_all_reviews(task.task_id):
        w.writerow([r.asin, r.rating, r.review_date,
                    r.verified_purchase, r.helpful_votes,
                    r.title, r.review_content])

print("导出完成")

四、HTTP API 直接调用

不依赖 SDK,直接调用 REST 接口:

# 提交任务
curl -X POST https://server.reveyes.cn/api/open/v1/reviews/fetch \
  -H "X-API-Key: your_key" \
  -H "Content-Type: application/json" \
  -d '{"asins":[{"asin":"B08G4CC41H","marketplace":"US","pages":3}]}'

# 查询结果
curl "https://server.reveyes.cn/api/open/v1/reviews/result/{task_id}?page=1&page_size=50" \
  -H "X-API-Key: your_key"

错误码说明:

code 含义
0 成功
1001 API Key 无效
1002 积分不足
1003 参数错误
1004 任务不存在

五、工程实现要点

5.1 Cookie 池并发管理

Cookie 分配使用数据库行级锁,保证多进程/多线程安全:

SELECT * FROM amazon_nurture_tasks
WHERE marketplace = ?
  AND is_usable = 1
  AND in_use = 0
  AND (locked_until IS NULL OR locked_until < NOW())
ORDER BY last_used_at ASC
LIMIT 1
FOR UPDATE

查询后立即 UPDATE in_use = 1,任务完成后释放。

5.2 CSRF 令牌获取容错

200 无令牌是 Cookie 被软封的信号,处理策略:

获取 CSRF 令牌
  ├── 成功 → 继续爬取
  ├── 200 无令牌 → 锁定当前 Cookie 10 分钟 → 换新 Cookie → 重试(最多10次)
  └── 其他错误 → 任务标记失败,等待重试队列

5.3 任务并发调度

采用异步并发限制器控制同时运行的任务数:

async function runConcurrent(items, fn, limit) {
  const executing = new Set();
  for (const item of items) {
    const p = fn(item).finally(() => executing.delete(p));
    executing.add(p);
    if (executing.size >= limit) {
      await Promise.race(executing);
    }
  }
  await Promise.allSettled(executing);
}

limit 值建议不超过当前站点可用 Cookie 数量。

5.4 反爬延迟策略

每页请求之间加随机延迟,避免固定频率被识别:

const ms = minDelay + Math.floor(Math.random() * (maxDelay - minDelay));
await sleep(ms);  // 默认 2000~5000ms

六、开源说明

核心采集逻辑、后端服务与前端界面均已在 GitHub 开源,可自行部署私有化版本:

https://github.com/zhuojiuya/Amazon-Review

Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐