写了个自动化工具监控竞品库存分享一下思路我写了一个脚本用来监控竞品在亚马逊上的库存变化。今天把思路和代码分享出来供有类似需求的同行参考。这个工具的核心逻辑很简单定时抓取竞品Listing的页面信息提取库存数量记录到数据库当库存发生显著变化时触发告警。但在实现过程中有几个技术细节值得讨论。一、系统架构整体架构采用轻量级设计避免引入不必要的复杂度# 核心模块结构 inventory_monitor/ ├── config.yaml # 监控目标配置 ├── fetcher.py # 页面抓取模块 ├── parser.py # 库存解析模块 ├── storage.py # 数据存储模块 ├── notifier.py # 告警通知模块 ├── scheduler.py # 定时调度模块 └── main.py # 入口脚本技术选型抓取层Python requests Selenium备用解析层BeautifulSoup4 正则表达式存储层SQLite单机部署零运维成本调度层APScheduler轻量级定时任务通知层企业微信Webhook即时通知二、库存抓取的技术难点亚马逊的库存信息并不直接显示在页面上。对于多数产品需要通过以下方式获取方案AAdd-to-Cart trick将商品加入购物车设置数量为999亚马逊会返回实际可售库存数量。这是业界常用的库存探测方法但存在以下限制对Prime Exclusive商品无效频繁请求可能触发验证码或IP封禁部分类目如服装、鞋类因变体较多返回的数据不准确方案B页面HTML解析部分Listing在HTML中嵌入了库存相关的JSON数据通过解析data属性或内联JavaScript可以提取。这种方法请求频率更低但可靠性取决于亚马逊前端代码的结构稳定性。我最终采用了混合策略优先使用方案B当方案B无法获取数据时回退到方案A。核心代码片段def fetch_inventory(asin: str) - Optional[int]: 获取指定ASIN的当前库存数量 返回None表示无法获取 url fhttps://www.amazon.com/dp/{asin} headers { User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36, Accept-Language: en-US,en;q0.9, } # 方案B尝试从页面HTML解析 response requests.get(url, headersheaders, timeout15) soup BeautifulSoup(response.text, html.parser) # 查找库存相关的JSON数据 stock_data soup.find(div, {id: availability}) if stock_data: text stock_data.get_text(stripTrue) match re.search(rOnly (\d) left in stock, text) if match: return int(match.group(1)) # 方案A回退到Add-to-Cart trick return fetch_inventory_via_cart(asin)三、反爬策略与请求频率控制亚马逊的反爬机制较为严格需要合理控制请求频率# config.yaml 节选 monitor: targets: - asin: B08N5WRWNW name: 竞品A-蓝牙耳机 check_interval: 3600 # 每小时检查一次 stock_threshold: 50 # 库存低于50时告警 - asin: B07RGZ5NKS name: 竞品B-手机支架 check_interval: 7200 # 每2小时检查一次 stock_threshold: 100 rate_limit: requests_per_minute: 6 # 全局限速每分钟不超过6次请求 retry_attempts: 3 # 失败重试次数 retry_delay: 5 # 重试间隔秒 proxy_rotation: true # 启用代理轮换关键参数说明check_interval根据监控目标的优先级动态调整。对于核心竞品1小时一次足够对于次要竞品可以降低到4到6小时一次。requests_per_minute保守设置。以每小时监控10个ASIN计算每分钟0.17次请求远低于限速阈值留有充足的安全余量。proxy_rotation当监控目标超过20个时建议启用。我使用的是住宅代理池成本约$5/GB每月消耗约2GB。四、数据存储与趋势分析SQLite表结构设计CREATE TABLE inventory_log ( id INTEGER PRIMARY KEY AUTOINCREMENT, asin TEXT NOT NULL, product_name TEXT, stock_quantity INTEGER, captured_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, source TEXT DEFAULT html_parse -- html_parse | cart_trick ); CREATE INDEX idx_asin_time ON inventory_log(asin, captured_at);基于采集的数据可以生成以下分析视图库存消耗速率计算竞品从库存500降到0所需的时间估算其日销量补货周期记录竞品库存从0恢复到正常水平的时间间隔推断其供应链响应速度断货频率统计特定周期内竞品断货的次数评估其库存管理能力示例查询计算近7天平均日销量SELECT asin, product_name, (MAX(stock_quantity) - MIN(stock_quantity)) * 1.0 / 7 AS avg_daily_sales FROM inventory_log WHERE captured_at datetime(now, -7 days) GROUP BY asin;五、运行效果与成本工具部署在一台$5/月的VPS上1核1G配置已稳定运行8个月。资源消耗CPU峰值占用约15%Selenium实例启动时日常5%内存常驻内存约120MB存储SQLite数据库每月增长约50MB监控15个ASIN每小时采集一次月度运营成本VPS$5代理流量$10企业微信Webhook免费合计$15/月对比第三方竞品监控工具如Helium 10的Inventory Manager$39/月起自建方案的财务成本降低约60%但需要投入初始开发时间和后续维护精力。六、局限性与改进方向当前版本存在的已知局限亚马逊前端变更风险页面HTML结构变更会导致解析失败。目前通过双方案回退机制缓解但无法完全消除。变体商品支持不足对于多变体Listing当前版本仅监控默认变体未覆盖全部子ASIN。缺乏Seller信息无法区分库存来自FBA还是FBM这对竞品分析有一定影响。后续改进计划集成Amazon Product Advertising APIPA API获取更结构化的数据增加多站点支持目前仅支持US站引入简单的机器学习模型基于历史数据预测竞品补货时间完整代码已开源至GitHub感兴趣的同行可以搜索amazon-inventory-monitor获取。代码采用MIT协议可自由修改使用。