Install
openclaw skills install amz-category-researchAmazon Category Research Skill for sellers. Automated ASIN analysis, competitor research, and market intelligence. Use when user mentions: 亚马逊, Amazon, 类目调研, 类目分析, 品类分析, category research, 竞品分析, 竞品调研, competitor analysis, ASIN分析, ASIN调研, ASIN research, 选品, 选品分析, product research, 市场调研, market research, 产品调研, 产品分析, 亚马逊运营, Amazon FBA, FBA卖家, 运营分析, 销量分析, sales analysis, BSR排名, Best Sellers, 畅销榜, 热销榜, 排名分析, 卖家精灵, SellerSprite, SIF, 流量词, 流量分析, 关键词调研, keyword research, 广告分析, ad analysis, 利润率, 利润分析, 新品, 新品调研, 跟卖, 品牌分析, brand analysis, 店铺分析, store analysis, 数据采集, 数据抓取, data scraping, listing分析, listing优化, 产品详情, 产品信息采集, 月销量, monthly sales, 上架时间, listing date, FBA费用, FBA fee, review分析, review analysis, 评论分析, 评分分析, 站外流量, off-site traffic, 视觉文案, 产品主图, A+页面, A+ content
openclaw skills install amz-category-research{workspace_dir}/amazon-category-research/{YYYYMMDD-HHmmss}-{搜索词/ASIN/类目名}{搜索词/ASIN/类目名}-{YYYYMMDD-HHmmss}.md{workspace_dir} 是 agent workspace 的绝对路径,例如:/Users/hehehe/.openclaw/agents/main/workspace创建飞书文档前,必须先确认用户 OAuth 授权状态。
1. 检查当前对话用户是否有飞书授权
2. 如果授权不完善或缺失 → 调用 feishu_oauth_batch_auth 一次性全量授权
3. ⚠️ Gotcha: 不要只授权部分 scope,后续创建/写入文档时又会缺权限
4. ⚠️ Gotcha: 必须用对话用户的身份创建文档,不能用机器人身份
重要:此步骤仅需在 首次安装 Skill 时执行一次,用于检查插件安装和账号登录状态。后续正常使用时,Agent 会自动跳过此步骤直接进入采集流程。
自动配置检查流程:
1. browser navigate 到亚马逊测试商品页(如 https://www.amazon.com/dp/B0CC27124P?th=1)
2. browser act(kind="wait", timeMs=5000)
3. exec: python3 scripts/init.py check → 获取检查 JS
4. browser act(kind="evaluate", fn=检查JS) → 获取检查结果
5. exec: python3 scripts/init.py report '<检查结果JSON>' → 生成配置报告
6. 根据报告状态决定后续操作:
- status=ready → 继续 Step 1
- status=partial → 警告用户后继续(部分字段可能缺失)
- status=blocked → 停止采集,提示用户安装/登录插件
配置报告状态说明:
| 状态 | 含义 | 后续操作 |
|---|---|---|
| ready | 所有插件已安装并登录 | 正常开始采集 |
| partial | 部分插件未登录 | 警告后继续,标注缺失字段 |
| blocked | 缺少必要插件 | 停止采集,引导用户配置 |
插件检查逻辑:
#seller-sprite-extension-quick-view-listing 或 [id*="seller-sprite"][data-sif-container] 或 [class*="sif-"]用户可能给出三种输入,按以下路由处理:
场景 A:用户直接给了 ASIN List
→ 直接进入 Step 2
⚠️ Gotcha: ASIN 必须是 10 位大写字母数字,格式不匹配的要问用户确认
⚠️ Gotcha: ASIN 数量上限 20 个,超出时优先取头部
场景 B:用户只给了关键词(如"paper towel holder under cabinet")
1. browser navigate 到 https://www.amazon.com/s?k={关键词编码}
2. 等待 5 秒
3. 用 evaluate 提取自然搜索结果 ASIN(仅 s-search-result,排除广告/购物车/推荐):
(() => {
const items = document.querySelectorAll('[data-component-type="s-search-result"]');
return Array.from(items)
.map(e => e.getAttribute('data-asin'))
.filter(a => /^[A-Z0-9]{10}$/.test(a))
.slice(0, 20);
})()
4. 取前 10-20 个 ASIN → 进入 Step 2
⚠️ Gotcha: data-component-type="s-search-result" 是自然搜索结果的唯一标识,必须用这个选择器
⚠️ Gotcha: 广告商品的 component-type 是 "s-search-result" 但有 Sponsored 标记,选择器本身已过滤大部分广告
⚠️ Gotcha: 如果搜索结果 < 10 个,说明关键词太窄,建议用户补充关联关键词
⚠️ Gotcha: 关键词含空格或特殊字符,URL 编码用 encodeURIComponent
场景 C:用户只给了类目名称(如"Kitchen Towel Hooks")
1. 优先方案:browser navigate 到类目 BSR 页面
https://www.amazon.com/gp/bestsellers/kitchen/{node_id}
node_id 可从关键词搜索结果页面包屑导航获取
2. 备用方案:如果不知道 node_id → 问用户要类目链接或 BSR 页面 URL
3. 用 evaluate 提取 BSR 页面 ASIN(限定在 #zg-right-col 内,排除购物车 ewc-item):
(() => {
const container = document.querySelector('#zg-right-col');
if (!container) return [];
const items = container.querySelectorAll('[data-asin]');
const seen = new Set();
return Array.from(items)
.filter(e => !e.className?.includes('ewc-item'))
.map(e => e.getAttribute('data-asin'))
.filter(a => /^[A-Z0-9]{10}$/.test(a) && !seen.has(a) && seen.add(a))
.slice(0, 20);
})()
备用方案(如果 data-asin 不可用,从链接提取):
(() => {
const container = document.querySelector('#zg-right-col');
if (!container) return [];
const links = container.querySelectorAll('a[href*="/dp/"]');
const seen = new Set();
return Array.from(links)
.map(a => a.href?.match(/\/dp\/([A-Z0-9]{10})/)?.[1])
.filter(a => a && !seen.has(a) && seen.add(a))
.slice(0, 20);
})()
4. 取前 10-20 个 ASIN → 进入 Step 2
⚠️ Gotcha: 必须限定在 #zg-right-col 内提取,否则会抓到页面其他区域(如左侧导航)的 ASIN
⚠️ Gotcha: 必须排除 ewc-item class,否则购物车 ASIN 会被混入
⚠️ Gotcha: Amazon 类目 node_id 不是固定的,同一个类目在不同站点可能有不同 node_id
⚠️ Gotcha: 不要猜 node_id,要么从面包屑导航获取,要么问用户
⚠️ Gotcha: 如果用户给的是中文类目名,需要翻译成英文后再搜索 Amazon
⚠️ Gotcha: 类目名 + "best sellers" 搜索可以快速定位 BSR 页面
通用原则:
1. browser status → 确认 openclaw profile 可用
2. 异常 → browser start 重接管
3. 三件套验证:tabs → open https://example.com → snapshot
4. ⚠️ Gotcha: 三件套不过就不要开始采集,不要硬上
5. ⚠️ Gotcha: 不得使用 profile="user"、9222/9229 端口、或 web_fetch
1. exec: python3 scripts/run_all.py generate
2. 拿到合并后的 JS 代码(~10KB)
3. ⚠️ Gotcha: 不要用全页 snapshot 提取数据!snapshot 返回 15万字符会撑爆上下文
4. ⚠️ Gotcha: JS 是 IIFE 格式 (() => { ... })(),直接作为 evaluate 的 fn 参数传入
将 ASIN List 按 3~5 个一组分成多个 batch,每个 batch 并行采集:
BATCH_SIZE = 3~5(默认 3,ASIN 总数 ≤10 时可用 5)
对每个 batch 重复以下流程:
1. 并行 open:对 batch 内每个 ASIN,一次性 browser open https://www.amazon.com/dp/{ASIN}?th=1
→ 记录所有 tab 的 targetId
2. 等待加载:browser act(kind="wait", timeMs=8000) 等待页面和卖家精灵/SIF插件注入
3. 批量 evaluate:对 batch 内所有 tab,一次性并行发出 evaluate(targetId 各不相同,互不依赖)
→ 收集所有 JSON 结果
4. 批量解析校验:将所有 JSON 结果一次性传给 parse_raw 和 validate
→ exec: python3 scripts/parse_raw.py all '<全部JSON合并>'
→ exec: python3 scripts/validate.py '<全部解析后JSON>'
5. 批后清理:关闭本 batch 所有 tab(browser close targetId=...)
6. 批间暂停:browser act(kind="wait", timeMs=3000) 等 3 秒后进入下一个 batch
7. 如果 validate 报 missing 字段 → 进入自愈流程(Step 5)
⚠️ Gotcha: navigate 超时是正常现象,open 后页面通常已加载完成,直接 evaluate 即可
⚠️ Gotcha: evaluate 的 fn 参数是字符串,注意引号转义
⚠️ Gotcha: targetId 从 browser open 返回值获取,不要硬编码
⚠️ Gotcha: 批量 evaluate 时所有 fn 相同,仅为 targetId 不同,一次性全部发出,无需逐个等待
⚠️ Gotcha: 反爬页(continue-shopping/Robot Check/Sorry)→ 停止采集该 ASIN,标注反爬
⚠️ Gotcha: 插件浮窗不要关闭,它包含销量/FBA费/上架时间等关键字段
⚠️ Gotcha: 卖家精灵插件数据在 spirit_raw 字段里,包含品牌/销量/FBA费/上架时间/流量词等
⚠️ Gotcha: SIF 插件数据在 sif_raw 字段里,可能不随页面自动加载
⚠️ Gotcha: batch 间必须关闭旧 tab 再开新 batch,避免浏览器内存溢出
⚠️ Gotcha: 3 并发已验证稳定(2026-05-27 Sofa Cover 20 ASIN 实测无反爬),5 并发时需观察反爬
⚠️ Gotcha: 如遇到反爬(CAPTCHA/Robot Check),立即降级为串行模式逐个采集
串行降级(当并行遇到反爬时):
如果 Step 4 并行采集过程中遇到反爬,降级为串行模式逐个采集,每 ASIN 等待 5-8 秒,每 2-3 个 ASIN 暂停 15-30 秒。串行流程与上述并行流程基本相同,只是每次只处理一个 ASIN。
当 validate.py 报告 missing 字段时:
1. exec: python3 scripts/healer.py diagnose '[missing_field_ids]'
2. 拿到诊断 JS → browser act(kind="evaluate", fn=诊断JS)
3. 将诊断结果传给 healer:
exec: python3 scripts/healer.py propose '<诊断结果JSON>'
4. 审查修复建议 → 确认后:
exec: python3 scripts/healer.py apply <field_id> <new_selector>
5. ⚠️ Gotcha: healer apply 会修改 selector_registry.py,旧选择器降级为 fallback
⚠️ Gotcha: apply 前必须确认新选择器确实匹配了正确的元素,不要盲目应用
格式规范:输出必须遵循
references/output-template.md模板结构,确保报告格式美观、专业、统一。模板包含完整的章节框架、表格样式和占位符说明。
1. 汇总所有 ASIN 采集结果
2. 按 `references/output-template.md` 模板结构生成 Markdown 内容
- 所有 `{占位符}` 替换为真实数据
- `<!-- ... -->` 注释块内的指引内容删除
- 未获取的字段统一标注 `{未获取}` 或 `{需人工复核}`
- 反爬失败的 ASIN 单独标注,不在主对比表中出现
- 每张表格 ≤ 6 列,列数过多时拆分
- 需人工复核的模块用 `> ⚠️` 标注
3. 保存 MD 源文件:
a. 创建文件夹:`{workspace_dir}/amazon-category-research/{YYYYMMDD-HHmmss}-{搜索词/ASIN/类目名}`
b. 保存 MD 文件:在上述文件夹下保存 `{搜索词/ASIN/类目名}-{YYYYMMDD-HHmmss}.md`
c. `{workspace_dir}` 是 agent workspace 的绝对路径,例如:`/Users/hehehe/.openclaw/agents/main/workspace`
4. feishu_create_doc 创建文档
5. 如果内容较长,分段创建:先创建主体,再用 feishu_update_doc append 追加
⚠️ Gotcha: 文档创建者必须是当前用户身份,不能用机器人身份
⚠️ Gotcha: 标题格式:亚马逊类目调研|{搜索词/ASIN/类目名}|{YYYY-MM-DD}
⚠️ Gotcha: 主图 URL 写入飞书时用代码格式包裹,避免 _AC_ 被当斜体
⚠️ Gotcha: 不在文档中暴露本地绝对路径
⚠️ Gotcha: Markdown 开头不要写与 title 相同的一级标题
⚠️ Gotcha: 必须先保存 MD 源文件,再创建飞书文档!MD 源文件是权威备份
1. DM 中只发送:文档链接 + 3-5 句简要摘要(完成度/核心发现/需人工复核项)
2. 禁止在 DM 中发送完整报告正文
3. 如果用户问具体数据,可以简短回答,但仍指向飞书文档
⚠️ Gotcha: DM 长消息格式差、无法协作、阅读体验极差,必须用飞书文档交付
⚠️ Gotcha: 即使说“不用生成文档”,也必须生成,这是强制规则
⚠️ Gotcha: 简要摘要控制在 200 字以内,不要在 DM 里写小作文
scripts 已固化全部字段和选择器,agent 无需再读需求文档。
| 模块 | 字段 | 来源 |
|---|---|---|
| 产品基础 | ASIN/标题/售价/星级/Review数/品牌/卖家/变体 | evaluate |
| 卖家精灵 | 30天销量/FBA费/毛利率/上架时间/流量词数/BSR排名 | evaluate(spirit_raw) |
| BSR排名 | 大类/小类排名 | evaluate(spirit_raw + detail_bullets) |
| 视觉文案 | 图片/卖点/A+/视频存在性 | evaluate |
评估结论分三级:推荐进入 / 谨慎观察 / 不建议进入,从以下三个维度综合判断:
1. 盈利空间
2. 市场容量
3. 竞争强度(以下信号越多越不推荐)
结论输出必须包含:
Seller: 抓到材质名(Stainless Steel/Black/SUS304) → 错抓,置"未获取"
List Price: 与售价相同且无 List Price/Was 标签 → 不记录
Other Sellers: 抓到 0/08/ASIN片段 → 不记录
BSR: 必须含 # + 类目名
Review差评率: 必须有1-3星百分比来源,不得按均值倒推
反爬页: 不提取任何核心字段,只标记"被反爬"
完整规则见 references/negative-rules.md
| 异常 | 策略 |
|---|---|
| 反爬页 | 等待15秒刷新1次,仍失败标记反爬 |
| navigate 超时 | 查 tabs 复用,重试1次,仍失败标记加载失败 |
| evaluate 返回空 | 检查 targetId 是否正确,用 snapshot(compact=true) 复核页面状态 |
| 字段获取失败 | 记录"未获取/需人工复核" + 来源方法 |
| 插件未加载 | 标记"需卖家精灵/SIF插件" |
| 浏览器控制链异常 | browser start 重启,仍失败 → 停止,输出 partial/resource_lack |
| 选择器失效 | healer.py 自愈 |
脚本目录:skills/amazon-category-research/scripts/(相对 skill 根目录)
| 脚本 | 用途 | 何时调用 |
|---|---|---|
init.py | 初始化检查:浏览器状态、插件安装/登录检测 | 仅首次安装时执行一次 |
run_all.py | 编排:生成合并 JS + 解析 + 校验 | Step 3 + Step 4 |
selector_registry.py | 选择器注册表(权威来源) | 被其他脚本 import |
gen_product.py | 生成产品基础字段 JS | 被 run_all.py 调用 |
gen_spirit.py | 生成卖家精灵字段 JS | 被 run_all.py 调用 |
gen_sif.py | 生成 SIF 字段 JS | 被 run_all.py 调用 |
gen_variants.py | 生成变体字段 JS | 被 run_all.py 调用 |
gen_bsr.py | 生成 BSR 字段 JS | 被 run_all.py 调用 |
parse_raw.py | 解析插件 raw → 结构化字段 | Step 4 |
validate.py | 校验缺失/可疑/错误 | Step 4 |
healer.py | 自愈:诊断 + 修复 + 写入 registry | Step 5 |
⚠️ Gotcha: 脚本在你的 skill 目录下,browser agent 无法访问。所以采集由你直接执行,不派发
⚠️ Gotcha: healer.py apply 会修改 selector_registry.py,旧选择器自动降级为 fallback
⚠️ Gotcha: gen_*.py 不要单独调用,用 run_all.py generate 统一生成
| 文件 | 内容 | 何时读取 |
|---|---|---|
references/output-template.md | MD/飞书文档输出模板(必读) | 每次生成报告时严格遵循 |
references/selectors.md | DOM 选择器映射表(人可读版) | 选择器失效需人工复核时 |
references/negative-rules.md | 易错字段负面规则 | 采集时校验(核心规则已在上方速查) |
references/examples.md | 输入输出示例 | 首次执行参考格式 |