一、前言:电商人都绕不开的数据痛点
做电商运营、选品、竞品分析的朋友一定有过这种煎熬: 每天手动打开几十个商品页面,复制粘贴价格、库存、活动信息到 Excel;竞品半夜降价、上新规格、清仓促销完全错过;几十上百款商品长期跟踪,历史价格趋势、销量变化无从追溯;遇到大促节点,人力盯盘根本覆盖不过来,错失调价、对标活动的最佳时机。
尝试自己写页面抓取脚本又会踩一堆坑:频繁访问被平台限制、页面改版解析规则全部失效、动态渲染内容抓取不全、服务器部署稳定性差,维护成本极高。
今天给大家分享一套轻量化落地方案,借助 Open Claw 一站式数据通道,50 行左右 Python 代码就能搭建7×24 小时商品监控 + 自动数据存储 + 变动预警 + 趋势分析全流程系统,无需复杂爬虫开发,新手也能直接部署使用。
二、方案整体思路
整套系统分为 4 个闭环模块,全程自动化运行:
稳定数据获取:依托成熟的数据通道,输入商品唯一编号即可完整拉取标题、原价、实时售价、多规格 SKU、库存、品牌、店铺、主图、规格参数等全维度结构化信息,规避页面反爬限制。
数据持久存储:采用轻量 SQLite 本地数据库保存每一轮采集数据,自动留存时间戳,用于后续价格走势、库存波动统计。
变动识别预警:每次采集后对比上一轮历史数据,当价格降幅超过自定义阈值、库存清零、新增 SKU 规格时,控制台输出预警提示,可拓展对接钉钉 / 企业微信消息推送。
自动化数据分析:封装趋势统计函数,一键导出单商品 7 日价格报表、多竞品横向对比表格,支持 Excel 文件本地保存,直接用于运营决策。
三、前期准备工作
本地 Python 环境(3.7 及以上版本);
安装依赖库,执行命令:
3.开通权限,获取专属两组身份凭证(下文代码中KEY、SECRET替换为自己的凭证);
4.整理需要监控的京东商品数字 ID(商品详情页链接末尾一串数字),填入监控列表。
四、完整可运行 Python 代码
4.1 主监控脚本(monitor_jd_goods.py)
import requests
import json
import sqlite3
import time
import pandas as pd
import schedule
from datetime import datetime
# ===================== 配置区,自行修改 =====================
# Open Claw身份凭证
CLAW_KEY = "替换为你的专属KEY"
CLAW_SECRET = "替换为你的专属SECRET"
# 需要监控的商品ID列表
MONITOR_GOODS_IDS = ["10335871600", "10057467958584"]
# 监控轮询间隔,单位秒(普通商品5分钟,爆款建议1分钟)
POLL_SECONDS = 300
# 降价预警阈值,0.2=降价超20%触发提醒
PRICE_ALERT_THRESHOLD = 0.2
# 本地数据库文件名
DB_NAME = "goods_monitor.db"
# ==========================================================
def init_sqlite_db():
"""初始化本地数据库,创建商品数据表"""
conn = sqlite3.connect(DB_NAME)
cursor = conn.cursor()
# 建表:存储每一次采集的全量商品数据
cursor.execute('''
CREATE TABLE IF NOT EXISTS goods_data (
id INTEGER PRIMARY KEY AUTOINCREMENT,
goods_id TEXT NOT NULL,
collect_time TEXT NOT NULL,
title TEXT,
brand TEXT,
current_price REAL,
original_price REAL,
stock_num INTEGER,
shop_name TEXT,
sales_volume INTEGER,
sku_info TEXT
)
''')
conn.commit()
conn.close()
print("数据库初始化完成")
def fetch_single_goods(goods_id):
"""通过Open Claw通道拉取单款商品完整结构化数据"""
request_url = "https://api-gw.onebound.cn/jd/item_get_pro"
params = {
"key": CLAW_KEY,
"secret": CLAW_SECRET,
"num_iid": goods_id,
"result_type": "json",
"cache": "yes",
"lang": "cn"
}
headers = {
"Accept-Encoding": "gzip",
"Connection": "close"
}
try:
resp = requests.get(url=request_url, params=params, headers=headers, timeout=15)
resp_json = resp.json()
# 判断返回状态,0000代表数据正常返回
if resp_json.get("error_code") != "0000":
print(f"【采集失败】商品{goods_id},错误信息:{resp_json.get('error')}")
return None
item_data = resp_json.get("item", {})
return item_data
except Exception as e:
print(f"【网络异常】商品{goods_id}采集出错:{str(e)}")
return None
def save_data_to_db(goods_raw):
"""将采集到的商品数据存入本地数据库"""
conn = sqlite3.connect(DB_NAME)
cursor = conn.cursor()
now_time = datetime.now().strftime("%Y-%m-%d %H:%M:%S")
goods_id = goods_raw.get("num_iid")
title = goods_raw.get("title", "")
brand = goods_raw.get("brand", "")
curr_price = float(goods_raw.get("price", 0))
ori_price = float(goods_raw.get("orginal_price", 0))
stock = int(goods_raw.get("num", 0))
shop = goods_raw.get("seller_info", {}).get("shop_name", "")
sales = int(goods_raw.get("sales", 0))
sku_str = json.dumps(goods_raw.get("sku", {}), ensure_ascii=False)
insert_sql = '''
INSERT INTO goods_data
(goods_id, collect_time, title, brand, current_price, original_price, stock_num, shop_name, sales_volume, sku_info)
VALUES (?,?,?,?,?,?,?,?,?,?)
'''
cursor.execute(insert_sql, (goods_id, now_time, title, brand, curr_price, ori_price, stock, shop, sales, sku_str))
conn.commit()
conn.close()
print(f"【数据入库成功】{goods_id} | {title[:20]}... 现价:{curr_price}")
def check_price_alert(goods_raw):
"""对比历史数据,判断是否触发降价预警"""
goods_id = goods_raw.get("num_iid")
curr_price = float(goods_raw.get("price", 0))
conn = sqlite3.connect(DB_NAME)
df_history = pd.read_sql(
f"SELECT current_price FROM goods_data WHERE goods_id = '{goods_id}' ORDER BY collect_time DESC LIMIT 1",
conn
)
conn.close()
# 首次采集无历史数据,跳过对比
if len(df_history) == 0:
return
last_price = df_history.iloc[0]["current_price"]
# 计算降价幅度
if last_price == 0:
return
drop_rate = (last_price - curr_price) / last_price
if drop_rate >= PRICE_ALERT_THRESHOLD:
print("="*60)
print(f"⚠️ 价格大幅变动预警 | 商品ID:{goods_id}")
print(f"上次价格:{last_price} 当前价格:{curr_price} 降幅:{round(drop_rate*100,2)}%")
print("="*60)
def goods_monitor_task():
"""单次监控主任务:循环采集所有商品、入库、预警判断"""
print(f"\n===== 新一轮监控启动 {datetime.now().strftime('%Y-%m-%d %H:%M:%S')} =====")
for goods_id in MONITOR_GOODS_IDS:
item_info = fetch_single_goods(goods_id)
if not item_info:
continue
# 价格变动预警检测
check_price_alert(item_info)
# 数据存入数据库
save_data_to_db(item_info)
time.sleep(1) # 轻微延时,降低通道压力
def export_goods_trend(goods_id, day_count=7):
"""数据分析函数:导出单商品近N天价格趋势Excel报表"""
conn = sqlite3.connect(DB_NAME)
df = pd.read_sql(f'''
SELECT collect_time, current_price, original_price, stock_num, sales_volume
FROM goods_data
WHERE goods_id = '{goods_id}'
ORDER BY collect_time ASC
''', conn)
conn.close()
if len(df) == 0:
print(f"商品{goods_id}暂无历史数据,无法导出报表")
return
save_path = f"商品{goods_id}_价格趋势报表.xlsx"
df.to_excel(save_path, index=False)
print(f"趋势报表已导出至:{save_path},共{len(df)}条历史记录")
return df
if __name__ == "__main__":
# 初始化数据库
init_sqlite_db()
# 立即执行一次监控
goods_monitor_task()
# 定时循环调度
schedule.every(POLL_SECONDS).seconds.do(goods_monitor_task)
print(f"\n定时监控已启动,每{POLL_SECONDS/60}分钟自动执行一次,关闭程序终止监控")
while True:
schedule.run_pending()
time.sleep(1)4.2 数据分析辅助脚本(analysis_tool.py)
单独运行可快速导出竞品对比、历史价格数据,适合日常复盘使用:
五、代码核心功能拆解说明
1. 稳定数据拉取逻辑
通道内置缓存机制,默认复用近期缓存数据大幅提升响应速度,也可修改参数关闭缓存获取实时最新信息;返回数据为标准化 JSON 结构,无需手动解析杂乱网页标签,直接提取价格、库存、SKU、店铺等关键字段。
内置异常捕获机制:商品下架、编号错误、网络波动、通道限流等场景均会打印清晰日志,单个商品采集失败不会中断整轮监控任务,稳定性更强。
2. 本地轻量化存储
使用 SQLite 文件型数据库,无需安装 MySQL、PostgreSQL 等重型数据库,Windows、Mac、Linux 服务器均可直接运行;每一轮采集自动写入时间戳,完整留存价格、库存全周期历史记录,长期跟踪商品生命周期变化。
3. 智能变动预警逻辑
每次采集自动对比上一轮留存价格,当降价幅度超过自定义比例时控制台高亮输出预警;可自行拓展函数,新增库存告急、新增 SKU 规格、店铺活动上线等多种预警规则,对接钉钉机器人推送消息实现离线提醒。
4. 开箱即用数据分析能力
封装好报表导出函数,一键生成 Excel 格式趋势表,包含采集时间、实时售价、原价、库存、销量多维度指标;支持批量导出所有监控商品最新数据,快速做多款竞品横向对标,直接用于定价、活动策划、选品分析。
六、系统部署与拓展优化方案
1. 服务器 7×24 小时常驻运行
2. 预警消息推送拓展
在check_price_alert函数内部增加钉钉 / 企业微信 webhook 请求,价格变动时自动推送消息到工作群,示例简易推送代码片段:
3. 多规格 SKU 深度监控
返回数据中sku_info字段存储所有尺寸、颜色规格的独立价格与库存,可新增子函数解析 JSON,单独跟踪某一个细分规格的价格波动,精准对标竞品细分 SKU 活动。
4. 数据可视化拓展
基于导出的 Excel 报表,搭配 Matplotlib、Pyecharts 绘制价格波动折线图,自动生成可视化图片,每周自动发送运营周报。
七、落地使用场景总结
竞品价格监控:批量跟踪同行同款商品,捕捉大促降价、限时优惠券、清仓活动,及时调整自身定价策略;
选品数据复盘:长期记录新品价格、销量走势,判断单品生命周期、市场热度,辅助备货与推广预算分配;
自营店铺库存预警:实时监控自家商品库存余量,库存见底自动提醒补货,避免断流损失流量;
活动对标分析:记录竞品活动起止时间、优惠力度,策划差异化营销活动抢占流量;
自动化报表输出:替代人工复制 Excel,每日 / 每周自动导出完整数据报表,节省运营 2 小时以上重复工作。
八、避坑小贴士
监控轮询间隔不要设置过短,爆款商品建议最低 60 秒间隔,避免高频请求触发通道限流;
长期运行建议定期备份goods_monitor.db数据库文件,防止本地文件丢失历史数据;
商品编号输入务必核对准确,错误 ID 会直接返回无数据提示,可提前在平台商品页面校验数字;
若需要更高并发监控上百款商品,可增加多线程采集逻辑,提升单轮采集速度。
整套方案上手门槛极低,无需精通网页抓取、反爬对抗、分布式存储等复杂技术,借助 Open Claw 成熟的数据通道,把核心精力放在数据分析与运营决策上,适合电商个人卖家、小型运营团队、数据实习生快速落地商品自动化监控系统。