×

api 数据挖掘

告别人工盯品!基于 Open Claw 搭建京东商品全自动监控与数据分析系统(完整可运行代码)

admin admin 发表于2026-08-09 17:34:14 浏览7 评论0

抢沙发发表评论

一、前言:电商人都绕不开的数据痛点

做电商运营、选品、竞品分析的朋友一定有过这种煎熬: 每天手动打开几十个商品页面,复制粘贴价格、库存、活动信息到 Excel;竞品半夜降价、上新规格、清仓促销完全错过;几十上百款商品长期跟踪,历史价格趋势、销量变化无从追溯;遇到大促节点,人力盯盘根本覆盖不过来,错失调价、对标活动的最佳时机。

尝试自己写页面抓取脚本又会踩一堆坑:频繁访问被平台限制、页面改版解析规则全部失效、动态渲染内容抓取不全、服务器部署稳定性差,维护成本极高。

今天给大家分享一套轻量化落地方案,借助 Open Claw 一站式数据通道,50 行左右 Python 代码就能搭建7×24 小时商品监控 + 自动数据存储 + 变动预警 + 趋势分析全流程系统,无需复杂爬虫开发,新手也能直接部署使用。

二、方案整体思路

整套系统分为 4 个闭环模块,全程自动化运行:

  1. 稳定数据获取:依托成熟的数据通道,输入商品唯一编号即可完整拉取标题、原价、实时售价、多规格 SKU、库存、品牌、店铺、主图、规格参数等全维度结构化信息,规避页面反爬限制。

  2. 数据持久存储:采用轻量 SQLite 本地数据库保存每一轮采集数据,自动留存时间戳,用于后续价格走势、库存波动统计。

  3. 变动识别预警:每次采集后对比上一轮历史数据,当价格降幅超过自定义阈值、库存清零、新增 SKU 规格时,控制台输出预警提示,可拓展对接钉钉 / 企业微信消息推送。

  4. 自动化数据分析:封装趋势统计函数,一键导出单商品 7 日价格报表、多竞品横向对比表格,支持 Excel 文件本地保存,直接用于运营决策。

三、前期准备工作

  1. 本地 Python 环境(3.7 及以上版本);

  2. 安装依赖库,执行命令:

pip install requests pandas sqlite3 schedule

3.开通权限,获取专属两组身份凭证(下文代码中KEYSECRET替换为自己的凭证);

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)

单独运行可快速导出竞品对比、历史价格数据,适合日常复盘使用:

import sqlite3
import pandas as pd

DB_NAME = "goods_monitor.db"

def batch_export_all_goods():
    """导出所有监控商品最新一轮数据,横向对比竞品"""
    conn = sqlite3.connect(DB_NAME)
    # 取每个商品最新采集记录
    df_all = pd.read_sql('''
        SELECT * FROM goods_data gd1
        WHERE collect_time = (
            SELECT MAX(collect_time) FROM goods_data gd2 WHERE gd2.goods_id = gd1.goods_id
        )
    ''', conn)
    conn.close()
    save_file = "全商品竞品对比表.xlsx"
    df_all.to_excel(save_file, index=False)
    print(f"竞品对比表导出完成,路径:{save_file}")

if __name__ == "__main__":
    # 导出全部商品最新数据对比
    batch_export_all_goods()
    # 单独导出某款商品7日价格趋势
    from monitor_jd_goods import export_goods_trend
    export_goods_trend("10335871600", day_count=7)

五、代码核心功能拆解说明

1. 稳定数据拉取逻辑

通道内置缓存机制,默认复用近期缓存数据大幅提升响应速度,也可修改参数关闭缓存获取实时最新信息;返回数据为标准化 JSON 结构,无需手动解析杂乱网页标签,直接提取价格、库存、SKU、店铺等关键字段。

内置异常捕获机制:商品下架、编号错误、网络波动、通道限流等场景均会打印清晰日志,单个商品采集失败不会中断整轮监控任务,稳定性更强。

2. 本地轻量化存储

使用 SQLite 文件型数据库,无需安装 MySQL、PostgreSQL 等重型数据库,Windows、Mac、Linux 服务器均可直接运行;每一轮采集自动写入时间戳,完整留存价格、库存全周期历史记录,长期跟踪商品生命周期变化。

3. 智能变动预警逻辑

每次采集自动对比上一轮留存价格,当降价幅度超过自定义比例时控制台高亮输出预警;可自行拓展函数,新增库存告急、新增 SKU 规格、店铺活动上线等多种预警规则,对接钉钉机器人推送消息实现离线提醒。

4. 开箱即用数据分析能力

封装好报表导出函数,一键生成 Excel 格式趋势表,包含采集时间、实时售价、原价、库存、销量多维度指标;支持批量导出所有监控商品最新数据,快速做多款竞品横向对标,直接用于定价、活动策划、选品分析。

六、系统部署与拓展优化方案

1. 服务器 7×24 小时常驻运行

  • Windows:搭配 nssm 工具将 Python 脚本注册为系统服务,开机自启;

  • Linux:使用 systemd 配置守护进程,后台持续运行监控任务,断连自动重启。

2. 预警消息推送拓展

check_price_alert函数内部增加钉钉 / 企业微信 webhook 请求,价格变动时自动推送消息到工作群,示例简易推送代码片段:

# 钉钉推送示例,填入自己的机器人webhook地址
ding_webhook = "你的钉钉机器人链接"
push_data = {
    "msgtype": "text",
    "text": {"content": f"商品大幅降价预警:{goods_id},降幅{round(drop_rate*100,2)}%"}
}
requests.post(ding_webhook, json=push_data)

3. 多规格 SKU 深度监控

返回数据中sku_info字段存储所有尺寸、颜色规格的独立价格与库存,可新增子函数解析 JSON,单独跟踪某一个细分规格的价格波动,精准对标竞品细分 SKU 活动。

4. 数据可视化拓展

基于导出的 Excel 报表,搭配 Matplotlib、Pyecharts 绘制价格波动折线图,自动生成可视化图片,每周自动发送运营周报。

七、落地使用场景总结

  1. 竞品价格监控:批量跟踪同行同款商品,捕捉大促降价、限时优惠券、清仓活动,及时调整自身定价策略;

  2. 选品数据复盘:长期记录新品价格、销量走势,判断单品生命周期、市场热度,辅助备货与推广预算分配;

  3. 自营店铺库存预警:实时监控自家商品库存余量,库存见底自动提醒补货,避免断流损失流量;

  4. 活动对标分析:记录竞品活动起止时间、优惠力度,策划差异化营销活动抢占流量;

  5. 自动化报表输出:替代人工复制 Excel,每日 / 每周自动导出完整数据报表,节省运营 2 小时以上重复工作。

八、避坑小贴士

  1. 监控轮询间隔不要设置过短,爆款商品建议最低 60 秒间隔,避免高频请求触发通道限流;

  2. 长期运行建议定期备份goods_monitor.db数据库文件,防止本地文件丢失历史数据;

  3. 商品编号输入务必核对准确,错误 ID 会直接返回无数据提示,可提前在平台商品页面校验数字;

  4. 若需要更高并发监控上百款商品,可增加多线程采集逻辑,提升单轮采集速度。

整套方案上手门槛极低,无需精通网页抓取、反爬对抗、分布式存储等复杂技术,借助 Open Claw 成熟的数据通道,把核心精力放在数据分析与运营决策上,适合电商个人卖家、小型运营团队、数据实习生快速落地商品自动化监控系统。


少长咸集

群贤毕至

访客