
Tags:
Amazon APIAI AgentLangChainPython电商数据实时数据
难度: 中级 | 阅读时长: 15分钟
背景与问题
亚马逊大卖家(年GMV 1000万+)的核心竞争优势之一是实时数据能力:每15-30分钟采样竞品BSR、价格、库存,通过内部BI系统驱动实时决策。这套基础设施的自建成本每年在$60,000-$120,000之间,对中小团队完全不可及。
本文介绍一套基于 Pangolinfo Scrape API + LangChain AI Agent 的替代架构,实现相同数据能力,月成本控制在$50以内。
系统架构
┌─────────────────────────────────────────────────────┐
│ AI Agent Layer │
│ LangChain Agent ← Tools: [BSR监控, 专利扫描, 报告] │
└──────────────────┬──────────────────────────────────┘
│
┌──────────────────▼──────────────────────────────────┐
│ Data Processing Layer │
│ Python Scripts: 清洗 / 异常检测 / 趋势分析 │
└──────────────────┬──────────────────────────────────┘
│
┌──────────────────▼──────────────────────────────────┐
│ Data Acquisition Layer │
│ Pangolinfo Scrape API (99%+ 成功率) │
│ Amazon US/UK/DE/JP + Walmart + eBay + Etsy │
└─────────────────────────────────────────────────────┘
环境依赖
pip install requests langchain openai pandas schedule python-dotenv
# .env 配置
PANGOLINFO_API_KEY=your_pangolinfo_key
OPENAI_API_KEY=your_openai_key
SLACK_WEBHOOK_URL=https://hooks.slack.com/services/xxx/yyy/zzz
核心模块实现
1. 数据采集模块
# amazon_data_client.py
import requests
import os
from typing import Optional
class AmazonDataClient:
"""Pangolinfo Scrape API 客户端封装"""
BASE_URL = "https://api.pangolinfo.com/v1/amazon"
def __init__(self, api_key: Optional[str] = None):
self.api_key = api_key or os.getenv("PANGOLINFO_API_KEY")
self.session = requests.Session()
self.session.headers.update({"Authorization": f"Bearer {self.api_key}"})
def get_product(self, asin: str, marketplace: str = "US") -> dict:
"""获取商品实时数据(BSR、价格、库存、评论)"""
resp = self.session.get(
f"{self.BASE_URL}/product",
params={
"asin": asin,
"marketplace": marketplace,
"fields": "bsr,price,inventory_status,review_count,title,brand"
},
timeout=15
)
resp.raise_for_status()
return resp.json()
def get_category_top(self, category_id: str, limit: int = 100) -> list:
"""获取品类Top N ASIN列表"""
resp = self.session.get(
f"{self.BASE_URL}/category/bestsellers",
params={"category_id": category_id, "marketplace": "US", "limit": limit},
timeout=30
)
resp.raise_for_status()
return resp.json().get("asins", [])
def get_search_results(self, keyword: str, pages: int = 3) -> list:
"""获取关键词搜索结果页数据"""
results = []
for page in range(1, pages + 1):
resp = self.session.get(
f"{self.BASE_URL}/search",
params={"keyword": keyword, "marketplace": "US", "page": page},
timeout=20
)
if resp.ok:
results.extend(resp.json().get("results", []))
return results
2. 异常检测模块
# anomaly_detector.py
from dataclasses import dataclass
from typing import List
@dataclass
class Alert:
alert_type: str
asin: str
message: str
severity: str # HIGH / MEDIUM / LOW
action_suggestion: str
class BSRAnomalyDetector:
"""BSR异常检测:断货预警 + 需求激增检测"""
LOW_STOCK_SIGNALS = [
"Only 1 left in stock",
"Only 2 left in stock",
"Only 3 left in stock",
"Temporarily out of stock",
"Currently unavailable"
]
def __init__(self, bsr_surge_threshold: int = 200, window_size: int = 4):
self.bsr_surge_threshold = bsr_surge_threshold
self.window_size = window_size # 检测窗口(采样次数)
self.bsr_history: dict = {}
def process(self, asin: str, current_bsr: int, inv_status: str) -> List[Alert]:
alerts = []
# 断货预警
if any(sig in inv_status for sig in self.LOW_STOCK_SIGNALS):
alerts.append(Alert(
alert_type="STOCKOUT_IMMINENT",
asin=asin,
message=f"库存预警: {inv_status}",
severity="HIGH",
action_suggestion="立即将该品类广告预算提升40-60%,窗口期预计12-36小时"
))
# BSR激增检测(排名数字下降 = 销量上升)
history = self.bsr_history.get(asin, [])
if len(history) >= 2:
prev_bsr = history[-1]
bsr_change = prev_bsr - current_bsr # 正值=排名上升
if bsr_change > self.bsr_surge_threshold:
alerts.append(Alert(
alert_type="BSR_SURGE",
asin=asin,
message=f"BSR单次上升{bsr_change}位,当前排名#{current_bsr}",
severity="MEDIUM",
action_suggestion="分析需求驱动因素,评估是否需要紧急补货"
))
# 更新历史
history.append(current_bsr)
self.bsr_history[asin] = history[-self.window_size:]
return alerts
3. AI Agent工具集
# agent_tools.py
from langchain.tools import tool
from amazon_data_client import AmazonDataClient
import json
client = AmazonDataClient()
@tool
def get_asin_realtime_data(asin: str) -> str:
"""
获取指定ASIN的亚马逊实时数据,包括BSR排名、价格、库存状态和评论数量。
输入: ASIN字符串(例如 B0XXXXXXXXX)
输出: JSON格式的实时数据
"""
data = client.get_product(asin)
return json.dumps(data, ensure_ascii=False)
@tool
def scan_patent_risk(keyword: str) -> str:
"""
扫描指定关键词在USPTO/WIPO数据库中的专利风险。
输入: 产品描述关键词(英文)
输出: 风险等级(LOW/MEDIUM/HIGH)和相关专利摘要
"""
# 示意实现——实际接入USPTO公开API或专利扫描服务
return json.dumps({
"keyword": keyword,
"risk_level": "MEDIUM",
"note": "发现2项相关外观设计专利,建议审查设计差异化方案",
"patents_found": 2
}, ensure_ascii=False)
@tool
def get_category_opportunities(category_keyword: str) -> str:
"""
分析指定品类关键词的市场机会,返回Top20 ASIN的BSR分布和竞争格局。
输入: 品类关键词(英文)
输出: 市场分析报告JSON
"""
results = client.get_search_results(category_keyword, pages=2)
analysis = {
"keyword": category_keyword,
"total_asins_analyzed": len(results),
"top_bsr_range": "需要实际数据",
"competition_level": "MEDIUM",
"entry_recommendation": "中等竞争,建议差异化切入"
}
return json.dumps(analysis, ensure_ascii=False)
4. LangChain AI Agent主程序
# main_agent.py
from langchain.agents import initialize_agent, AgentType
from langchain.chat_models import ChatOpenAI
from agent_tools import get_asin_realtime_data, scan_patent_risk, get_category_opportunities
import os
def create_product_research_agent():
"""创建亚马逊选品研究AI Agent"""
llm = ChatOpenAI(
model="gpt-4o",
temperature=0,
openai_api_key=os.getenv("OPENAI_API_KEY")
)
tools = [
get_asin_realtime_data,
scan_patent_risk,
get_category_opportunities
]
agent = initialize_agent(
tools=tools,
llm=llm,
agent=AgentType.OPENAI_FUNCTIONS,
verbose=True,
max_iterations=10
)
return agent
if __name__ == "__main__":
agent = create_product_research_agent()
# 示例任务:分析POD装饰画品类机会
task = """
分析以下任务:
1. 搜索关键词 "3D sandstone relief wall art" 的品类竞争情况
2. 扫描该品类的专利风险
3. 如果找到候选ASIN,获取其实时BSR数据
4. 综合以上数据,给出入场建议(风险等级、推荐入场价区间、备货时机)
"""
result = agent.run(task)
print("\n=== 选品分析报告 ===")
print(result)
5. 定时监控调度
# scheduler.py
import schedule
import time
import json
from datetime import datetime
from amazon_data_client import AmazonDataClient
from anomaly_detector import BSRAnomalyDetector
import requests
import os
client = AmazonDataClient()
detector = BSRAnomalyDetector(bsr_surge_threshold=200)
WATCH_LIST = [
{"asin": "B0XXXXXXXXX", "label": "竞品A"},
{"asin": "B0YYYYYYYYY", "label": "竞品B"},
]
def send_slack_alert(alerts):
"""发送Slack预警通知"""
webhook_url = os.getenv("SLACK_WEBHOOK_URL")
if not webhook_url or not alerts:
return
message = "\n".join([
f"🚨 [{a.severity}] {a.alert_type} | ASIN: {a.asin}\n"
f"📊 {a.message}\n💡 {a.action_suggestion}"
for a in alerts
])
requests.post(webhook_url, json={"text": f"亚马逊实时监控预警\n{message}"})
def monitoring_cycle():
"""单次监控循环"""
print(f"[{datetime.now().strftime('%H:%M:%S')}] 开始监控...")
all_alerts = []
for item in WATCH_LIST:
try:
data = client.get_product(item["asin"])
alerts = detector.process(
asin=item["asin"],
current_bsr=data.get("bsr", 0),
inv_status=data.get("inventory_status", "")
)
all_alerts.extend(alerts)
except Exception as e:
print(f"Error fetching {item['asin']}: {e}")
if all_alerts:
send_slack_alert(all_alerts)
print(f"发送 {len(all_alerts)} 条预警")
# 每30分钟执行一次监控
schedule.every(30).minutes.do(monitoring_cycle)
if __name__ == "__main__":
print("亚马逊实时数据监控系统已启动(30分钟间隔)")
monitoring_cycle() # 立即执行第一次
while True:
schedule.run_pending()
time.sleep(60)
部署建议
# 推荐用 supervisor 守护进程
[program:amazon_monitor]
command=python /path/to/scheduler.py
directory=/path/to/project
autostart=true
autorestart=true
stderr_logfile=/var/log/amazon_monitor.err.log
stdout_logfile=/var/log/amazon_monitor.out.log
核心参数调优参考
| 参数 | 保守配置 | 激进配置 | 说明 |
|---|---|---|---|
| BSR采样间隔 | 60分钟 | 15分钟 | 越短API消耗越大 |
| 断货预警阈值 | “Only 3 left” | “Only 5 left” | 越早预警越多误报 |
| BSR激增阈值 | 200位 | 100位 | 根据品类BSR分布调整 |
| WATCH_LIST大小 | 20-50 ASIN | 100-200 ASIN | 影响月API成本 |
如果这套架构对你有帮助,欢迎点赞收藏。有技术问题可以在评论区交流,或者去Pangolinfo文档中心提工单。
172



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



