🎯 一款可定制、具备反检测功能的云浏览器,由自主研发的 Chromium驱动,专为网页爬虫AI 代理设计。👉立即试用
返回博客

如何随时间监测亚马逊Rufus推荐意见

Michael Lee
Michael Lee

Expert Network Defense Engineer

17-Jun-2026

重点要点:

  • 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 概述中的品牌可见性 自然配对,后者跟踪搜索端的相同推荐问题。


管道一览

整个系统分为六个阶段,从头到尾:

  1. 定义查询集——固定的购物问题列表,由每个捕获返回的 related_questions 扩展。
  2. 逐个查询捕获——使用 type: rufus 将每个查询 POST 到 scraper.amazon 角色;不支持的区域不返回 Rufus 答案,管道记录并跳过。
  3. 提取产品——遍历 content_blocks,提取每个产品的 ASIN、整体排名和部分标签。
  4. 映射 ASIN → 品牌——使用小的启发式从产品标题解析品牌,以便在 ASIN 级别上聚合份额。
  5. 存储每次运行的快照——按查询和捕获时间键附加每个查询的一个 JSONL 记录;永不覆盖。
  6. 随时间差异比较——比较连续快照以报告推荐占比以及哪些 ASIN 进入或退出。

第 1-4 阶段在每个周期的每个查询上运行;第 5-6 阶段将这些捕获转化为时间序列。以下部分按顺序构建每个阶段。


先决条件

  • Python 3.10 或更新版本(下面的代码仅使用标准库加上 requests
  • 一个 Scrapeless 账户和 API 密钥——请在 app.scrapeless.com 注册
  • 将密钥导出为 SCRAPELESS_API_KEY
  • 对终端和 JSON 有基本的了解

阶段 1 — 定义查询集

监控程序的有效性在于其查询集。以您跟踪的类别为基础,开始时关注那些重要的购物问题——以购物者询问 Rufus 的方式表达,清晰表明购买意图。

python Copy
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 Copy
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 Copy
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 Copy
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 Copy
// Schema 是 scraper.amazon (类型: rufus) 返回的内容;字段值是来自实际运行的示例(部分和产品已修剪)。
{
  "metadata": { "type": "rufus", "rawUrl": "https://…" },
  "result": {
    "user_query": "最佳噪音取消耳机",
    "content_blocks": [
      {
        "type": "product_section",
        "category": "顶部精选 - 最佳 ANC",
json Copy
"产品": [
          {
            "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 Copy
// 管道输出 — 说明性示例(模式真实,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答案?

Copy
两个原因。查询可能不够交易性——将其表述为一个购买问题,并明确产品意图。或者您所针对的区域没有Rufus表面,在这种情况下,参与者报告该商店的区域失败;固定一个支持的区域并将缺失记录为跳过。

**问:我需要代理还是浏览器吗?**
不需要。渲染、区域处理和解析在服务器端运行。您发送一个带有 `x-api-token` 头的POST请求并读取JSON响应;参与者返回已经结构化的推荐集。

**问:我如何获得产品的排名和出现的部分?**
遍历 `result.content_blocks`:每个 `product_section` 块都携带一个 `category` 头和自己的 `products` 数组。在扁平化块时计数产品可以得到总体排名,而块的 `category` 则给出部分——这两者在每个快照中都值得存储。

**问:推荐份额是什么?**
它是一个品牌在查询或查询集中的推荐位置所占的百分比,汇总自捕获的产品。随着时间的推移,它显示品牌在Rufus货架上的存在是增加还是减少——这是对话购物等同于声量份额的指标。

**问:为什么要存储快照而不是单一的当前视图?**
Rufus每个会话生成其答案,因此任何一次捕获都是一个时间点。按查询和捕获时间逐步生成的追加快照为您提供了历史差异对比,因此您可以报告在运行之间哪些ASIN进入或退出,而不是从单个响应中猜测。

**问:我可以同时监控多少个查询?**
保持并发适度——几个正在进行的查询足以进行稳定的监控运行。将范围限定在您采取行动的问题上,并让 `related_questions` 建议下一个要添加的问题,这样每个可计费的调用都能获得其位置。

在Scrapeless,我们仅访问公开可用的数据,并严格遵循适用的法律、法规和网站隐私政策。本博客中的内容仅供演示之用,不涉及任何非法或侵权活动。我们对使用本博客或第三方链接中的信息不做任何保证,并免除所有责任。在进行任何抓取活动之前,请咨询您的法律顾问,并审查目标网站的服务条款或获取必要的许可。

最受欢迎的文章

目录