
作者:Leo,Pangolinfo 技术负责人
标签:亚马逊 API、竞品分析、MCP、Python、数据采集
阅读时间:约 15 分钟
前言
做亚马逊运营五年多了,我写过不下 20 个竞品调研脚本。从最早的 Selenium 自动化,到 Playwright,再到直接调 API,这条路我走了一遍又一遍。这篇文章不是教程搬运,是我自己在 Pangolinfo 团队里落地的一套工程方案,包含完整代码,能直接跑。
如果你是做亚马逊数据分析的开发或者懂点代码的运营,这篇文章应该对你有用。
一、问题定义:传统调研方法为什么不行
我先把问题量化一下,不凭感觉说话。
| 维度 | 手动调研 | 传统爬虫工具 | API 实时方案 |
|---|---|---|---|
| 单品调研耗时 | 3-4 小时 | 20-30 分钟 | ~3 秒 |
| 数据误差率 | 20%-50% | 10%-30% | <1% |
| 数据时效性 | 调研时刻快照 | 工具数据库快照 | 实时 |
| 持续监控能力 | 无 | 有限(依赖工具更新频率) | 可自定义频率 |
| 广告位数据覆盖率 | 手动翻页,覆盖低 | 50%-70% | 98%(SP 广告位) |
| 并发能力 | 1 个人 1 次看 1 个 | 受工具限制 | 3000 万+/天 |
手动调研的核心问题在于:人肉遍历 + 人工记录 + 估算补全。你看到的"预估月销"是工具用 BSR 反推的,误差能到 50%。你看到的"广告花费"是工具用 CPC × 预估点击量算的,基本不可信。
二、竞品调研五步框架(IBADM)

在写代码之前,先明确调研框架。没有框架的代码就是在搬运数据,不产生价值。
Identify(识别)→ Baseline(基线)→ Analyze(分析)→ Differentiate(差异化)→ Monitor(监控)
每一步对应的数据需求:
- Identify:关键词搜索结果 → 自然排名 ASIN 列表 + 广告位 ASIN 列表
- Baseline:ASIN 详情 → 价格、BSR、评分、评论数、变体、主图、A+
- Analyze:关键词排名、评论内容、QA 内容、BSR 历史趋势
- Differentiate:评论情感分析、关键词缺口分析、价格弹性对比
- Monitor:定时任务 → 价格变动、BSR 变动、广告位变动、新增评论
三、技术架构
┌─────────────────────────────────────────────────────┐
│ 你的应用层 │
│ (Python脚本 / Jupyter / AI助手) │
├─────────────────────────────────────────────────────┤
│ Amazon Data MCP (19个工具) │
│ 远程HTTP调用 · 零安装 · 自然语言操作 │
├─────────────────────────────────────────────────────┤
│ Amazon Scraper API │
│ 数据延迟~3s · 3000万+/天 · 成功率99% · SP采集率98% │
├─────────────────────────────────────────────────────┤
│ Amazon 前台公开数据 │
└─────────────────────────────────────────────────────┘
两条路径:
- 直接调 API:适合开发,灵活度最高,返回结构化 JSON
- 通过 MCP:适合运营,自然语言操作,AI 自动编排工具调用
- Amazon Scraper API:https://www.pangolinfo.com/zh/amazon-shuju-caiji-api/?referrer=csdn_amz
- Amazon Data MCP:https://www.pangolinfo.com/zh/amazon-data-mcp-cn/?referrer=csdn_mcp
四、完整代码实现
4.1 环境准备
# requirements.txt
# requests>=2.31.0
# pandas>=2.0.0
# schedule>=1.2.0
import requests
import pandas as pd
import json
import time
from datetime import datetime
from typing import List, Dict, Optional
4.2 API 客户端封装
class PangolinfoClient:
"""Pangolinfo Amazon Scraper API 客户端"""
def __init__(self, api_key: str):
self.api_key = api_key
self.base_url = "https://api.pangolinfo.com/v1"
self.headers = {
"Authorization": f"Bearer {api_key}",
"Content-Type": "application/json"
}
self.session = requests.Session()
self.session.headers.update(self.headers)
def search_products(self, keyword: str, page: int = 1) -> Dict:
"""关键词搜索,返回自然排名 + SP广告位 ASIN"""
url = f"{self.base_url}/amazon/search"
payload = {
"keyword": keyword,
"page": page,
"domain": "com"
}
resp = self.session.post(url, json=payload, timeout=30)
resp.raise_for_status()
return resp.json()
def get_product_detail(self, asin: str) -> Dict:
"""获取 ASIN 完整详情"""
url = f"{self.base_url}/amazon/product"
payload = {"asin": asin, "domain": "com"}
resp = self.session.post(url, json=payload, timeout=30)
resp.raise_for_status()
return resp.json()
def get_keyword_ranking(self, asin: str, keywords: List[str]) -> Dict:
"""获取 ASIN 在指定关键词下的排名"""
url = f"{self.base_url}/amazon/keyword-ranking"
payload = {
"asin": asin,
"keywords": keywords,
"domain": "com"
}
resp = self.session.post(url, json=payload, timeout=30)
resp.raise_for_status()
return resp.json()
def get_reviews(self, asin: str, filter_type: str = "critical") -> Dict:
"""获取评论,filter_type: critical(差评) / positive(好评)"""
url = f"{self.base_url}/amazon/reviews"
payload = {
"asin": asin,
"filter_type": filter_type,
"domain": "com",
"page": 1
}
resp = self.session.post(url, json=payload, timeout=30)
resp.raise_for_status()
return resp.json()
4.3 五步框架实现
class CompetitorResearch:
"""竞品调研五步框架"""
def __init__(self, client: PangolinfoClient):
self.client = client
# ---------- Step 1: Identify ----------
def identify_competitors(self, keywords: List[str]) -> List[str]:
"""识别竞品:从关键词搜索结果中提取ASIN"""
competitor_set = set()
for kw in keywords:
result = self.client.search_products(kw, page=1)
# 自然排名 ASIN
for item in result.get("organic_results", []):
competitor_set.add(item["asin"])
# SP 广告位 ASIN
for item in result.get("sponsored_results", []):
competitor_set.add(item["asin"])
time.sleep(0.5) # 礼貌间隔
return list(competitor_set)
# ---------- Step 2: Baseline ----------
def build_baseline(self, asins: List[str]) -> pd.DataFrame:
"""建立基线:批量拉取竞品详情"""
records = []
for asin in asins:
detail = self.client.get_product_detail(asin)
records.append({
"asin": asin,
"title": detail.get("title", ""),
"price": detail.get("price", 0),
"bsr": detail.get("bsr", 0),
"rating": detail.get("rating", 0),
"review_count": detail.get("review_count", 0),
"variants": len(detail.get("variants", [])),
"images": len(detail.get("images", [])),
"has_a_plus": detail.get("has_a_plus", False),
"qa_count": detail.get("qa_count", 0),
"timestamp": datetime.now().isoformat()
})
return pd.DataFrame(records)
# ---------- Step 3: Analyze ----------
def analyze_keyword_gap(self, asin: str, target_keywords: List[str]) -> pd.DataFrame:
"""关键词缺口分析:对比竞品和自己的关键词覆盖"""
ranking = self.client.get_keyword_ranking(asin, target_keywords)
rows = []
for kw, rank in ranking.get("rankings", {}).items():
rows.append({
"keyword": kw,
"competitor_rank": rank,
"search_volume": ranking.get("volumes", {}).get(kw, 0)
})
return pd.DataFrame(rows)
def analyze_critical_reviews(self, asin: str, top_n: int = 50) -> Dict:
"""差评关键词频率分析"""
reviews = self.client.get_reviews(asin, filter_type="critical")
review_texts = [r["content"] for r in reviews.get("reviews", [])[:top_n]]
# 简单词频统计(生产环境建议用 NLP)
from collections import Counter
import re
words = []
for text in review_texts:
words.extend(re.findall(r'[a-z]{3,}', text.lower()))
return dict(Counter(words).most_common(20))
# ---------- Step 4: Differentiate ----------
def find_differentiation(
self, my_asin: str, competitor_asins: List[str], keywords: List[str]
) -> Dict:
"""差异化机会点:关键词缺口 + 差评痛点"""
gaps = {}
for comp_asin in competitor_asins:
gap_df = self.analyze_keyword_gap(comp_asin, keywords)
gaps[comp_asin] = gap_df.to_dict("records")
pain_points = {}
for comp_asin in competitor_asins:
pain_points[comp_asin] = self.analyze_critical_reviews(comp_asin)
return {
"keyword_gaps": gaps,
"competitor_pain_points": pain_points
}
# ---------- Step 5: Monitor ----------
def monitor_changes(
self, asins: List[str], output_path: str = "monitor_log.csv"
):
"""持续监控:定时拉取价格和BSR,记录变动"""
import schedule
def job():
df = self.build_baseline(asins)
df["check_time"] = datetime.now().isoformat()
try:
existing = pd.read_csv(output_path)
pd.concat([existing, df]).to_csv(output_path, index=False)
except FileNotFoundError:
df.to_csv(output_path, index=False)
print(f"[{datetime.now()}] 监控记录已更新,共 {len(asins)} 个ASIN")
schedule.every().day.at("09:00").do(job)
print(f"监控已启动,每日 09:00 执行,数据写入 {output_path}")
while True:
schedule.run_pending()
time.sleep(60)
4.4 完整调用示例
if __name__ == "__main__":
# 初始化
client = PangolinfoClient(api_key="your_api_key_here")
research = CompetitorResearch(client)
# 你的核心关键词
core_keywords = [
"silicone spatula set",
"heat resistant spatula",
"cooking spatula set"
]
# Step 1: 识别竞品
print(">>> Step 1: 识别竞品")
competitors = research.identify_competitors(core_keywords)
print(f"发现 {len(competitors)} 个竞品ASIN")
# Step 2: 建立基线
print(">>> Step 2: 建立基线")
baseline_df = research.build_baseline(competitors)
baseline_df.to_csv("competitor_baseline.csv", index=False)
print(baseline_df[["asin", "price", "bsr", "rating", "review_count"]].head())
# Step 3: 深度分析(以TOP3竞品为例)
top3 = baseline_df.nsmallest(3, "bsr")["asin"].tolist()
print(">>> Step 3: 关键词缺口分析")
for asin in top3:
gap = research.analyze_keyword_gap(asin, core_keywords)
print(f"\nASIN {asin} 关键词排名:")
print(gap)
# Step 4: 差异化
print(">>> Step 4: 差异化机会点")
my_asin = "B0XXXXXXXX" # 你的ASIN
diff = research.find_differentiation(my_asin, top3, core_keywords)
# Step 5: 启动监控
print(">>> Step 5: 启动持续监控")
research.monitor_changes(competitors, output_path="daily_monitor.csv")
五、MCP 方式:不写代码的替代方案
如果你不想写代码,或者你的运营团队需要自己操作,用 Amazon Data MCP 更合适。
# MCP 配置示例(claude_desktop_config.json)
{
"mcpServers": {
"amazon-data": {
"url": "https://mcp.pangolinfo.com/amazon-data-mcp",
"transport": "http"
}
}
}
配置好之后,直接在 AI 对话里说:
“帮我查 B0XXXXXXXX、B0YYYYYYYY、B0ZZZZZZZZ 这三个 ASIN 的价格、BSR 和评论数,做成对比表格”
AI 会自动调用 MCP 的 19 个工具里对应的那几个,把数据拉回来、格式化、给你分析。
19 个工具覆盖的场景包括:关键词搜索、ASIN 详情、BSR 历史、评论获取、关键词排名、广告位查询、QA 获取、变体信息等。
MCP 详细文档:https://www.pangolinfo.com/zh/amazon-data-mcp-cn/?referrer=csdn_mcp
六、性能数据
这套方案在我们生产环境的实测数据:
| 指标 | 数值 |
|---|---|
| API 平均响应时间 | 2.8s |
| 日均请求处理量 | 3000 万+ |
| 请求成功率 | 99.2% |
| SP 广告位采集率 | 98% |
| 并发支持 | 无上限(按需扩展) |
对比一下手动方案:一个竞品 3-4 小时,5 个竞品一天。API 方案 5 个竞品全量数据 3 秒内返回,加上分析脚本运行,整个流程不到 1 分钟。
七、踩过的坑
坑 1:不要在高峰期高频轮询同一个 ASIN
虽然 API 成功率 99%,但你在 Prime Day 期间对同一个 ASIN 每秒发 100 次请求,没有意义。数据 3 秒更新一次就够了。
坑 2:评论分析别只看好评
很多卖家只拉好评看竞品卖点,但真正有价值的信息在差评里。差评高频词 = 竞品弱点 = 你的差异化机会。
坑 3:监控数据要存历史
monitor_log.csv 这个文件一定要持续写。跑一个月后你会看到竞品的价格节奏、促销规律、BSR 波动周期。这些历史数据比单次快照值钱 100 倍。
总结
竞品调研的工程化方案核心就三件事:
- 用 API 替代手动采集——3 秒 vs 3 小时,数据准确率从 50%-80% 提升到 99%
- 用框架替代随机查看——IBADM 五步,每步有明确数据输入和决策输出
- 用持续监控替代单次快照——竞品是动态的,你的调研也必须是动态的
代码可以直接拿去改,API key 去 Pangolinfo 后台申请就行。
有问题评论区交流,我会回复技术问题。
作者:Leo | Pangolinfo 技术负责人
本文代码已在生产环境验证,转载请注明出处。
232



被折叠的 条评论
为什么被折叠?



