亚马逊新账号看不到评论?刷多了还封号——这个工具彻底解决
Python 采集亚马逊评论完整指南:CSRF 令牌获取与 Cookie 池管理实践
本文涉及的开源项目地址:https://github.com/zhuojiuya/Amazon-Review
前言
在做亚马逊评论数据采集时,开发者通常会遇到两个棘手问题:
- 新账号无法查看评论:账号无购买记录时,评论区内容被隐藏或限制
- 频繁翻页触发封控:高频访问评论区会触发 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 流转:pending → running → done / 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
AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。
更多推荐



所有评论(0)