用 Python 3 行代码批量抓取亚马逊评论——Reveyes SDK 完整教程
本文介绍如何使用开源 Python SDK
reveyes快速接入亚马逊评论抓取服务,适合跨境电商卖家、数据分析师和独立开发者。
背景:为什么要批量抓取亚马逊评论?
亚马逊评论是跨境电商领域最有价值的公开数据之一:
- 选品分析:了解竞品用户的真实痛点,找到差异化切入点
- 差评监控:实时掌握自家商品的负面反馈,快速响应
- 市场调研:多站点对比同一 ASIN 在不同地区的口碑差异
- 竞争情报:分析竞争对手的高频好评关键词,优化 listing
手动翻页效率极低,爬虫维护成本高(亚马逊反爬机制复杂),而 Reveyes 提供了一套稳定的评论抓取 API,本文介绍其官方 Python SDK 的使用方法。
一、安装
pip install reveyes
要求 Python 3.8+,唯一依赖是 requests,无重型依赖。
二、快速上手(3 行核心代码)
from reveyes import ReveyesClient
client = ReveyesClient(api_key="your_api_key")
task = client.fetch_reviews([{"asin": "B08N5WRWNW", "marketplace": "US", "pages": 2}])
result = client.wait_for_task(task.task_id)
for review in result.reviews.data:
print(f"★{review.rating} {review.title}")
print(f" {review.review_content[:100]}...")
API Key 可在 www.reveyes.cn 注册后免费获取。
三、核心概念
任务制设计
SDK 采用异步任务模式:
提交任务 (fetch_reviews)
↓
获取 task_id
↓
轮询状态 (get_task_result / wait_for_task)
↓
status = "done" 时取评论数据
这样设计是因为批量抓取多个 ASIN 需要时间,任务制可以避免 HTTP 超时,也便于断点续查。
积分机制
| 操作 | 积分 |
|---|---|
| 每页抓取 | 1 积分 |
| 1 页评论 | ≈ 10 条 |
| 任务完成退还 | 未抓取到数据的页自动退还 |
提交任务时按总页数预扣,完成后结算实际消耗,多退少不补。
四、详细用法
4.1 提交抓取任务
from reveyes import ReveyesClient, AsinFetchItem
client = ReveyesClient(api_key="your_api_key")
task = client.fetch_reviews([
# 最简:只填 ASIN,其余取默认值
{"asin": "B08N5WRWNW"},
# 完整参数控制
{
"asin": "B09G9FPHY6",
"marketplace": "DE", # 德国站
"pages": 5, # 抓 5 页(约 50 条)
"filter_star": "critical", # 只要差评(1-2星)
"filter_sort_by": "helpful", # 按有用数排序
"filter_reviewer_type": "avp_only_reviews", # 仅已验证购买
},
# 也可以使用 dataclass 方式
AsinFetchItem(asin="B07XJ8C8F7", marketplace="JP", pages=3, filter_star="five_star"),
])
print(f"任务 ID:{task.task_id}")
print(f"预扣积分:{task.pre_deduct}")
filter_star 可选值:
| 值 | 含义 |
|---|---|
all_stars | 全部(默认) |
five_star / four_star / ... / one_star | 指定星级 |
positive | 好评(4-5星) |
critical | 差评(1-2星) |
4.2 等待任务完成
# 方式一:自动阻塞等待(推荐)
result = client.wait_for_task(
task.task_id,
poll_interval=5, # 每 5 秒轮询一次
timeout=300, # 最多等 5 分钟
)
print(f"完成!共 {result.reviews.total} 条评论")
# 方式二:手动轮询(适合异步场景)
import time
while True:
result = client.get_task_result(task.task_id)
print(f"状态:{result.status},已完成 {result.finished_asins}/{result.total_asins} 个 ASIN")
if result.is_done:
break
time.sleep(5)
4.3 获取评论数据
# 第一页(默认 50 条)
result = client.get_task_result(task.task_id, page=1, page_size=50)
for review in result.reviews.data:
print(f"[{review.marketplace}] {review.asin}")
print(f"★{review.rating} {review.title}")
print(f"日期:{review.review_date} 评论者:{review.user_name}")
print(f"已验证购买:{'是' if review.verified_purchase else '否'}")
print(f"有用数:{review.helpful_votes}")
print(f"正文:{review.review_content[:200]}")
print()
ReviewItem 字段一览:
| 字段 | 类型 | 说明 |
|---|---|---|
asin | str | 商品 ASIN |
marketplace | str | 站点(US/DE/JP...) |
review_id | str | 亚马逊评论 ID |
rating | int | 星级 1-5 |
title | str | 评论标题 |
review_content | str | 评论正文 |
review_date | str | 日期 |
user_name | str | 评论者昵称 |
profile_url | str | 评论者主页链接 |
verified_purchase | int | 1=已验证购买 |
helpful_votes | int | 有用票数 |
product_variant | str | 商品变体(颜色/尺寸等) |
images | list | 评论附图 URL |
videos | list | 评论附视频 |
4.4 自动翻页迭代所有评论
当评论量很大时,无需手动处理分页:
# iter_all_reviews 自动处理分页,逐条 yield,内存友好
for review in client.iter_all_reviews(task.task_id, page_size=100):
# 这里处理每一条评论
process(review)
4.5 查询历史任务
tasks = client.list_tasks(page=1, page_size=20)
print(f"共 {tasks.total} 个历史任务")
for t in tasks.items:
print(f"{t.task_id} {t.status} {t.created_at:%Y-%m-%d}")
五、支持站点(20 个)
SDK 支持亚马逊全球 20 个主要站点:
| 区域 | 站点代码 | 域名 |
|---|---|---|
| 北美 | US CA MX | .com / .ca / .com.mx |
| 欧洲 | UK DE FR IT ES NL SE PL BE IE | .co.uk / .de / .fr ... |
| 亚洲 | JP IN SG | .co.jp / .in / .sg |
| 中东 | AE SA | .ae / .sa |
| 其他 | AU BR | .com.au / .com.br |
六、异常处理
SDK 对 API 错误进行了分类封装,方便精确处理:
from reveyes.exceptions import (
AuthenticationError, # API Key 无效或已禁用
InsufficientCreditsError, # 积分不足
BadParamsError, # 参数错误(如不支持的站点代码)
NotFoundError, # 任务不存在
ForbiddenError, # 无权访问他人任务
APIError, # 其他接口错误
)
try:
task = client.fetch_reviews([{"asin": "B08N5WRWNW", "pages": 10}])
result = client.wait_for_task(task.task_id, timeout=600)
except InsufficientCreditsError:
print("积分不足,请前往 https://www.reveyes.cn 充值")
except AuthenticationError:
print("API Key 无效,请检查")
except TimeoutError:
print("任务超时,可稍后用 task_id 手动查询")
except APIError as e:
print(f"接口异常 code={e.code}: {e}")
七、实战案例
案例 1:批量导出差评到 Excel
import csv
import os
from reveyes import ReveyesClient
client = ReveyesClient(api_key=os.environ["REVEYES_API_KEY"])
# 同时分析 3 个竞品的美国站差评
asins = ["B08N5WRWNW", "B09G9FPHY6", "B07XJ8C8F7"]
task = client.fetch_reviews([
{"asin": asin, "marketplace": "US", "pages": 5, "filter_star": "critical"}
for asin in asins
])
print(f"任务提交成功,预扣 {task.pre_deduct} 积分,等待中...")
result = client.wait_for_task(task.task_id, timeout=600)
print(f"完成!{result.reviews.total} 条差评,实耗 {result.actual_deduct} 积分")
with open("差评汇总.csv", "w", newline="", encoding="utf-8-sig") as f:
w = csv.writer(f)
w.writerow(["ASIN", "星级", "日期", "标题", "内容", "是否验证购买", "有用数"])
for review in client.iter_all_reviews(task.task_id, page_size=200):
w.writerow([
review.asin, review.rating, review.review_date,
review.title, review.review_content,
"是" if review.verified_purchase else "否",
review.helpful_votes,
])
print("已导出到 差评汇总.csv")
案例 2:同一商品多站点评分对比
from collections import defaultdict
from reveyes import ReveyesClient
client = ReveyesClient(api_key="your_key")
asin = "B08N5WRWNW"
task = client.fetch_reviews([
{"asin": asin, "marketplace": m, "pages": 3}
for m in ["US", "UK", "DE", "JP", "CA", "AU"]
])
result = client.wait_for_task(task.task_id)
stats = defaultdict(lambda: {"count": 0, "sum": 0})
for review in client.iter_all_reviews(task.task_id):
stats[review.marketplace]["count"] += 1
stats[review.marketplace]["sum"] += review.rating or 0
print(f"\n{'站点':<6} {'评论数':>8} {'平均评分':>10} {'可视化':}")
print("=" * 40)
for market, s in sorted(stats.items()):
avg = s["sum"] / s["count"] if s["count"] else 0
bar = "★" * round(avg) + "☆" * (5 - round(avg))
print(f"{market:<6} {s['count']:>8} {avg:>10.2f} {bar}")
输出示例:
站点 评论数 平均评分 可视化
========================================
AU 28 4.21 ★★★★☆
CA 35 4.40 ★★★★☆
DE 31 3.87 ★★★★☆
JP 19 4.63 ★★★★★
UK 42 4.05 ★★★★☆
US 88 4.18 ★★★★☆
案例 3:星级分布统计
from collections import Counter
from reveyes import ReveyesClient
client = ReveyesClient(api_key="your_key")
task = client.fetch_reviews([{"asin": "B08N5WRWNW", "marketplace": "US", "pages": 10}])
result = client.wait_for_task(task.task_id)
ratings = Counter(r.rating for r in client.iter_all_reviews(task.task_id))
total = sum(ratings.values())
print(f"\n评分分布(共 {total} 条)")
print("-" * 35)
for star in range(5, 0, -1):
count = ratings[star]
pct = count / total * 100 if total else 0
bar = "█" * int(pct / 2)
print(f"{'★' * star:<7} {count:>5} ({pct:>5.1f}%) {bar}")
八、最佳实践
1. 用环境变量保存 API Key
import os
client = ReveyesClient(api_key=os.environ["REVEYES_API_KEY"])
不要把 Key 硬编码在代码里,更不要提交到 Git。
2. 大批量任务拆分
单次任务 ASIN 数量建议不超过 50 个,可拆分多批提交:
def chunks(lst, n):
for i in range(0, len(lst), n):
yield lst[i:i + n]
all_asins = [...] # 假设 200 个 ASIN
for batch in chunks(all_asins, 50):
task = client.fetch_reviews([{"asin": a} for a in batch])
result = client.wait_for_task(task.task_id, timeout=600)
# 处理 result...
3. 合理设置 timeout
| 任务规模 | 建议 timeout |
|---|---|
| 1-5 个 ASIN,1-2 页 | 60s |
| 10-20 个 ASIN,3-5 页 | 300s |
| 50 个 ASIN,5-10 页 | 600s+ |
4. 保存 task_id 便于重试
import json
task = client.fetch_reviews([...])
# 保存 task_id
with open("task_ids.json", "a") as f:
json.dump({"task_id": task.task_id, "ts": str(task.created_at)}, f)
f.write("\n")
# 任务超时后,可以用 task_id 重新拉取(无需重新抓取,节省积分)
result = client.get_task_result("之前保存的task_id")
九、项目信息
| 信息 | 地址 |
|---|---|
| PyPI | pypi.org/project/rev… |
| GitHub | github.com/zhuojiuya/A… |
| 官网/注册 | www.reveyes.cn |
安装最新版:
pip install -U reveyes
总结
reveyes SDK 封装了亚马逊评论抓取的所有细节,开发者只需关注业务逻辑:
- ✅ 3 行代码完成评论抓取
- ✅ 支持 20 个亚马逊站点
- ✅ 丰富的过滤参数(星级、排序、验证购买等)
- ✅ 自动分页迭代,内存友好
- ✅ 清晰的异常分类,易于错误处理
- ✅ 积分预扣+自动退还机制,按实际用量计费
如有问题欢迎在 GitHub Issues 反馈。