如何随时间监测亚马逊Rufus推荐意见
Expert Network Defense Engineer
重点要点:
- Amazon Rufus 推荐是结构化的产品数据,而不是聊天记录。 对
scraper.amazon角色进行一次调用,使用type: rufus返回一个products数组,每个条目包含 ASIN、标题、价格、评分以及 Rufus 将其归类的部分标签。 - 推荐占比是此管道产生的指标。 跟踪 Rufus 随时间展示的固定查询集的 ASIN,将对话式货架转化为可测量的可见性信号——相当于 Rufus 的声量份额。
- Rufus 将其选择划分为标记部分。 响应按照 "最佳选择 - 最佳主动噪音取消" 和 "超值选择" 等
content_blocks分组产品,因此每个产品都有整体排名和框架的部分标题。 related_questions自行扩展种子查询集。 每个捕捉返回 Rufus 为该查询建议的后续问题,这些问题直接反馈到下次运行的提示列表中。- 每个字段都是可空的,答案是每个会话生成的。 对于给定区域,查询可能不返回 Rufus 答案,并且产品插槽可能没有
bought计数,因此管道存储每次运行的快照并读取系列,而不是单次调用。 - 管道简化为仅追加快照和差异比较。 每次运行写入一个以查询和捕捉时间为键的 JSONL 记录;将连续记录进行差异比较报告进入或退出运行的 ASIN。
- 免费开始。 新的 Scrapeless 账户包括免费试用积分——请在 app.scrapeless.com 注册。
介绍:购物货架进入助手
Amazon Rufus 用经过排名的产品列表回答购物问题。购物者询问最佳主动噪声取消耳机,Rufus 返回分组选择——“最佳选择”、“苹果用户最佳选择”、“超值选择”——每个都有价格、评分和购买链接,提供在助手中,且在加载任何搜索结果页面之前。对于品牌来说,问题不再是产品在结果网格中的排名;而是 Rufus 是否提到该产品、属于哪个部分以及排名。
这个货架在时光流逝中很难监控。Rufus 在每个会话中生成其答案,选择因查询和区域而改变,产品卡片在争斗自动化的对话界面中展示。仅通过眼睛阅读一次无法告诉你任何信息;信号在于推荐集每周的变化。
本指南在 Scrapeless Scraping API 的基础上构建了一个监控管道:输入一个固定的查询集,scraper.amazon 角色返回 Rufus 的推荐作为结构化产品,管道提取 ASIN、排名和部分,为每个 ASIN 映射一个品牌,存储每次运行的快照,并对快照进行差异比较以报告推荐占比。它与 Google AI 概述中的品牌可见性 自然配对,后者跟踪搜索端的相同推荐问题。
管道一览
整个系统分为六个阶段,从头到尾:
- 定义查询集——固定的购物问题列表,由每个捕获返回的
related_questions扩展。 - 逐个查询捕获——使用
type: rufus将每个查询 POST 到scraper.amazon角色;不支持的区域不返回 Rufus 答案,管道记录并跳过。 - 提取产品——遍历
content_blocks,提取每个产品的 ASIN、整体排名和部分标签。 - 映射 ASIN → 品牌——使用小的启发式从产品标题解析品牌,以便在 ASIN 级别上聚合份额。
- 存储每次运行的快照——按查询和捕获时间键附加每个查询的一个 JSONL 记录;永不覆盖。
- 随时间差异比较——比较连续快照以报告推荐占比以及哪些 ASIN 进入或退出。
第 1-4 阶段在每个周期的每个查询上运行;第 5-6 阶段将这些捕获转化为时间序列。以下部分按顺序构建每个阶段。
先决条件
- Python 3.10 或更新版本(下面的代码仅使用标准库加上
requests) - 一个 Scrapeless 账户和 API 密钥——请在 app.scrapeless.com 注册
- 将密钥导出为
SCRAPELESS_API_KEY - 对终端和 JSON 有基本的了解
阶段 1 — 定义查询集
监控程序的有效性在于其查询集。以您跟踪的类别为基础,开始时关注那些重要的购物问题——以购物者询问 Rufus 的方式表达,清晰表明购买意图。
python
SEED_QUERIES = [
"最佳降噪耳机",
"最佳旅行无线耳塞",
"最佳预算耳罩耳机",
已知品牌 = ("索尼", "博士", "苹果", "森海塞尔", "Beats", "JBL", "安克")
```python
def 从标题获取品牌(title: str) -> str | None:
if not title:
return None
lowered = title.lower()
for brand in 已知品牌:
if brand.lower() in lowered:
return brand
return title.split()[0] # 回退:标题的首个词
将 已知品牌 列表限制在您监控的类别内;回退处理长尾情况,无需查找表。
获取您的免费的 API 密钥: app.scrapeless.com
阶段 4 — 存储每次运行的快照
管道是仅追加的:每次捕获都会写入一条 JSONL 记录,以查询和捕获时间为键,并且从不覆盖。这使您能够拥有完整的历史记录进行比较,并且坏的或空的运行不会破坏先前的良好记录。
python
import json
import time
def 追加快照(path: str, query: str, rows: list[dict]) -> dict:
record = {"query": query, "captured_at": int(time.time()), "products": rows}
with open(path, "a", encoding="utf-8") as handle:
handle.write(json.dumps(record, ensure_ascii=False) + "\n")
return record
对 captured_at 使用整数纪元,使每条记录自描述且可排序,无需单独索引。要加载给定查询的历史,请逐行读取文件并根据 query 键进行过滤——一遍读取即可按捕获顺序获取每个快照。
阶段 5 — 计算推荐份额的差异并报告
两个读取函数将快照历史转化为指标。推荐份额计算每个品牌在一轮中出现的频率并归一化为百分比;差异比较两轮的 ASIN 集合以显示变动。
python
from collections import Counter
def 推荐份额(rows: list[dict]) -> dict[str, float]:
counts = Counter(row["brand"] for row in rows if row.get("brand"))
total = sum(counts.values())
if not total:
return {}
return {brand: round(100 * n / total, 1) for brand, n in counts.most_common()}
def 差异运行(prev_rows: list[dict], curr_rows: list[dict]) -> dict[str, list[str]]:
prev = {row["asin"] for row in prev_rows}
curr = {row["asin"] for row in curr_rows}
return {
"进入": sorted(curr - prev),
"丢弃": sorted(prev - curr),
}
针对每个查询运行 推荐份额,以了解哪些品牌在该问题的会话货架上占据主导地位,或者在整个查询集之间获得类别范围的视图。在查询的两个最新快照之间运行 差异运行,以捕捉一个品牌进入选择或退出选择的那一周——值得警惕的时刻。
调度和扩展
捕获循环将各个阶段结合在一起:对于每个查询,捕获、提取、快照,并记录一个空结果作为跳过。按照计划运行——每天或每周——JSONL 文件成为时间序列。
python
if __name__ == "__main__":
snapshot_path = "rufus_snapshots.jsonl"
for query in SEED_QUERIES:
result = capture_rufus(query)
rows = extract_products(result)
if not rows:
print(f"{query}: 此查询/地区没有 Rufus 答复")
continue
append_snapshot(snapshot_path, query, rows)
share = share_of_recommendation(rows)
leaders = ", ".join(f"{b} {pct}%" for b, pct in list(share.items())[:3])
print(f"{query}: {len(rows)} 种产品 — {leaders}")
当您扩展查询集时,有一些实际的边界:
- 保持并发适度——一次只有少量查询在飞行中就足够;监控运行是稳定的,而不是爆发性的。
- 每次运行固定区域,以保持系列可比;在一个地区没有返回 Rufus 答复的查询被记录为跳过,而不是混入另一个地区的数字中。
- 将查询集限制为您可以采取行动的内容。 每个查询是可计费的调用,因此监控那些推动决策的问题,并让
related_questions建议下一个要添加的问题。根据 Scrapeless 定价 计划节奏。
您得到的回报
每次捕获产生平坦的 products 列表以及分段分组的 content_blocks;管道将两者都减少到快照行和份额表。下面的形状是演员所返回的,被修剪为一个部分。
json
// Schema 是 scraper.amazon (类型: rufus) 返回的内容;字段值是来自实际运行的示例(部分和产品已修剪)。
{
"metadata": { "type": "rufus", "rawUrl": "https://…" },
"result": {
"user_query": "最佳噪音取消耳机",
"content_blocks": [
{
"type": "product_section",
"category": "顶部精选 - 最佳 ANC",
json
"产品": [
{
"asin": "B0GN4CFF6H",
"标题": "索尼 WH-1000XM6/B 无线降噪耳机",
"价格": "398.00美元",
"原价": "428.00美元",
"评分": "4.5",
"评论数": "238",
"配送": "免费配送 星期五, 6月19日",
"url": "https://…"
}
]
}
],
"产品": [
{ "asin": "B0GN4CFF6H", "标题": "索尼 WH-1000XM6/B …", "类别": "精选 – 最佳降噪" }
],
"相关问题": ["比较索尼 XM6 与博世 QC Ultra 2", "这些产品中有打折吗?"]
}
}
在经过第3至第5阶段后,一个快照记录及其推荐份额表如下所示:
json
// 管道输出 — 说明性示例(模式真实,ASIN/品牌/排名值为说明性):一个仅追加快照行加上推荐份额统计。
{
"快照": {
"查询": "最佳降噪耳机",
"捕获时间": 1781716376,
"产品": [
{ "asin": "B0GN4CFF6H", "排名": 1, "部分": "精选 – 最佳降噪", "品牌": "索尼" },
{ "asin": "B0FDKR293G", "排名": 2, "部分": "精选 – 最佳降噪", "品牌": "博世" },
{ "asin": "B0GSS4SGZR", "排名": 3, "部分": "适合苹果用户", "品牌": "苹果" }
]
},
"推荐份额": { "索尼": 33.3, "博世": 33.3, "苹果": 33.3 }
}
一些诚实的观察结果:
- 答案是按会话的。 同样的查询从一次到下一次返回不同的推荐集和不同的
相关问题。在每个记录上存储捕获时间;随着时间的推移,该系列才是信号,而不是任何单次捕获。 - 部分框架的排名。 产品的
部分(content_blocks[].category)解释了它为何排名在那儿——“适合苹果用户”与“超值精选”是不同的展示架。携带部分,而不仅仅是位置。 - 字段可以为空。
已购、原价和配送在某些产品中出现而在其他产品中不出现;半解析的插槽可能在没有标题或asin的情况下到达。使用.get()读取每个字段,并跳过该行,而不是存储空值。 - 区域决定是否有答案。 不支持的商店会返回区域失败而非产品。固定你监控的区域,并将缺失记录为跳过。
负责任地处理此事
该管道只读取Rufus向任何购物者展示的公共产品推荐——ASIN、标题、价格、评分和部分标签。仅限于该公共表面:不收集个人数据和帐户限制的内容,尊重亚马逊的服务条款和robots指令,仅存储监控程序所需的产品字段。推荐份额是从公共列表构建的品牌可见性指标,仅此而已。
结论:作为时间序列的对话架
监控亚马逊Rufus归结为一个循环:针对scraper.amazon演员以type: rufus捕获每个查询,从content_blocks提取ASIN、排名和部分,将每个ASIN映射到品牌,追加每次运行的快照,并对快照进行差异化以获取推荐份额。锁定区域,将每个字段视为可为空,记录缺失的答案为跳过,并让相关问题增加查询集。相同的监控形状适用于其他回答表面——将Rufus与抓取谷歌的AI概述配对,提供针对两个购物助手和搜索的一个程序。这里的演员、端点和字段名称已通过实时的Scrapeless抓取API参考确认。
准备好构建您的AI推荐监控管道了吗?
加入我们的社区以获取免费计划并与构建AI答案数据管道的开发者连接:Discord · Telegram。
访问app.scrapeless.com申请免费试用积分,并将上述查询集指向您的品牌可见性程序跟踪的Rufus类别和区域。
常见问题解答
问:监控亚马逊Rufus推荐是否合法?
捕获的数据是Rufus向任何购物者展示的公开可见产品推荐。与任何抓取一样,合法性取决于管辖区和用途——在构建之前查看相关条款并咨询法律顾问,仅收集公共产品数据,绝不收集个人或帐户限制数据。
问:为什么一个查询没有返回Rufus答案?
两个原因。查询可能不够交易性——将其表述为一个购买问题,并明确产品意图。或者您所针对的区域没有Rufus表面,在这种情况下,参与者报告该商店的区域失败;固定一个支持的区域并将缺失记录为跳过。
**问:我需要代理还是浏览器吗?**
不需要。渲染、区域处理和解析在服务器端运行。您发送一个带有 `x-api-token` 头的POST请求并读取JSON响应;参与者返回已经结构化的推荐集。
**问:我如何获得产品的排名和出现的部分?**
遍历 `result.content_blocks`:每个 `product_section` 块都携带一个 `category` 头和自己的 `products` 数组。在扁平化块时计数产品可以得到总体排名,而块的 `category` 则给出部分——这两者在每个快照中都值得存储。
**问:推荐份额是什么?**
它是一个品牌在查询或查询集中的推荐位置所占的百分比,汇总自捕获的产品。随着时间的推移,它显示品牌在Rufus货架上的存在是增加还是减少——这是对话购物等同于声量份额的指标。
**问:为什么要存储快照而不是单一的当前视图?**
Rufus每个会话生成其答案,因此任何一次捕获都是一个时间点。按查询和捕获时间逐步生成的追加快照为您提供了历史差异对比,因此您可以报告在运行之间哪些ASIN进入或退出,而不是从单个响应中猜测。
**问:我可以同时监控多少个查询?**
保持并发适度——几个正在进行的查询足以进行稳定的监控运行。将范围限定在您采取行动的问题上,并让 `related_questions` 建议下一个要添加的问题,这样每个可计费的调用都能获得其位置。
在Scrapeless,我们仅访问公开可用的数据,并严格遵循适用的法律、法规和网站隐私政策。本博客中的内容仅供演示之用,不涉及任何非法或侵权活动。我们对使用本博客或第三方链接中的信息不做任何保证,并免除所有责任。在进行任何抓取活动之前,请咨询您的法律顾问,并审查目标网站的服务条款或获取必要的许可。



