×

api 数据挖掘

告别手工盯屏,用 Open‑Claw 快速搭建电商商品监控与数据分析体系

admin admin 发表于2026-10-08 10:03:18 浏览7 评论0

抢沙发发表评论

本文适合电商运营、数据爱好者、Python 开发,手把手教你实现商品价格、库存、规格自动跟踪,完成历史数据存储、简单可视化分析。


前言

做电商运营、竞品调研的时候,很多人都有这样的痛点:需要持续关注多款商品的价格变动、库存变化、促销活动。如果每天手动打开网页复制记录,不仅耗费大量时间,还很容易漏掉转瞬即逝的降价、缺货节点。

直接写脚本解析网页源码,又会遇到重重阻碍:网页动态渲染、频繁触发访问限制、页面改版之后全部代码失效,调试成本极高。

最近接触到 Open‑Claw 这套工具套件,可以省去页面解析、反访问限制处理这些繁琐工作,直接拿到结构化的商品全量信息。我们只需要专注业务逻辑:定时拉取数据、落地存储、做统计分析,快速搭建一套属于自己的商品监控系统。

本文会完整演示从数据获取、持久化存储,到监控告警、数据分析可视化完整流程,所有示例均可直接修改配置运行。

整体实现思路

整套系统分成 4 个核心环节:

  1. 数据获取:输入商品编号,拿到标题、现价、原价、库存、多规格信息、店铺信息等结构化内容。

  2. 持久化存储:把每一次采集的数据存入本地数据库,留存历史记录,用于后续对比。

  3. 监控逻辑:定时执行采集任务,对比本次和上一轮价格、库存,出现变动输出提醒。

  4. 数据分析:基于历史数据,做价格波动统计、规格对比,输出图表,辅助运营判断。

环境准备:Python3.7 以上,安装依赖库

pip install requests pandas matplotlib sqlite3

一、商品原始数据获取

首先实现基础读取函数,传入商品编号就可以拿到完整结构化资料。只需要配置好自己的凭证信息,不需要处理网页 DOM、JS 渲染等复杂逻辑。

# coding:utf‑8
import requests
import json
import time
import sqlite3
import pandas as pd
import matplotlib.pyplot as plt
from datetime import datetime

# ========= 配置区,修改为自己的凭证与监控商品 =========
ACCESS_KEY = "你的访问凭证"
ACCESS_SECRET = "你的安全密钥"
MONITOR_GOODS_ID = "10335871600"
MONITOR_CYCLE = 1800  # 监控周期,单位秒,示例30分钟采集一次
# ==================================================

def get_goods_detail(goods_id):
    """
    获取商品结构化详情
    :param goods_id: 商品编号
    :return: dict商品数据,失败返回None
    """
    headers = {
        "Accept‑Encoding": "gzip",
        "Connection": "close"
    }
    params = {
        "key": ACCESS_KEY,
        "secret": ACCESS_SECRET,
        "num_iid": goods_id
    }
    try:
        resp = requests.get(
            "https://api‑gw.onebound.cn/jd/item_get_pro",
            params=params,
            headers=headers,
            timeout=20
        )
        res_json = resp.json()
        # 判断返回状态
        if res_json.get("error_code") != "0000":
            print(f"获取失败:{res_json.get('reason','未知错误')}")
            return None
        item_data = res_json.get("item")
        if not item_data:
            print("未找到对应商品")
            return None
        return item_data
    except Exception as e:
        print(f"网络异常:{str(e)}")
        return None

调用示例:

if __name__ == "__main__":
    info = get_goods_detail(MONITOR_GOODS_ID)
    if info:
        print(json.dumps(info, ensure_ascii=False, indent=2))

运行之后,即可拿到商品标题、当前售价、划线原价、库存、全部规格 sku、店铺名称、商品大图等完整结构化字典,不用自己写复杂页面解析逻辑。

二、本地数据库存储历史数据

要做监控和分析,必须留存每一次采集快照。这里选用轻量的 SQLite,无需额外安装数据库服务。新建数据表保存每次采集时间、商品基础信息。

def init_db():
    """初始化数据库,创建商品监控记录表"""
    conn = sqlite3.connect("goods_monitor.db")
    cursor = conn.cursor()
    create_sql = """
    CREATE TABLE IF NOT EXISTS goods_record (
        id INTEGER PRIMARY KEY AUTOINCREMENT,
        goods_id TEXT,
        title TEXT,
        price REAL,
        original_price REAL,
        stock INTEGER,
        shop_name TEXT,
        capture_time TEXT
    )
    """
    cursor.execute(create_sql)
    conn.commit()
    conn.close()

def save_to_db(item):
    """单条商品记录入库"""
    conn = sqlite3.connect("goods_monitor.db")
    cursor = conn.cursor()
    insert_sql = """
    INSERT INTO goods_record
    (goods_id, title, price, original_price, stock, shop_name, capture_time)
    VALUES (?,?,?,?,?,?,?)
    """
    cursor.execute(insert_sql, (
        item.get("num_iid"),
        item.get("title"),
        float(item.get("price",0)),
        float(item.get("orginal_price",0)),
        int(item.get("num",0)),
        item.get("seller_info",{}).get("shop_name",""),
        datetime.now().strftime("%Y‑%m‑%d %H:%M:%S")
    ))
    conn.commit()
    conn.close()

初始化数据库:

init_db()

三、实现监控告警逻辑

核心逻辑:每次拿到最新数据,读取数据库中上一条记录,对比价格、库存,如果发生变化打印告警提示,你可以扩展对接企业微信、邮件实现消息推送。

def get_last_record(goods_id):
    """读取该商品最近一条历史记录"""
    conn = sqlite3.connect("goods_monitor.db")
    df = pd.read_sql(
        f"SELECT * FROM goods_record WHERE goods_id='{goods_id}' ORDER BY id DESC LIMIT 1",
        conn
    )
    conn.close()
    if len(df) > 0:
        return df.iloc[0].to_dict()
    return None

def check_change(new_item):
    """对比新旧数据,检测变动,输出告警"""
    goods_id = new_item.get("num_iid")
    last = get_last_record(goods_id)
    if not last:
        print("首次采集,无历史对比数据")
        return

    new_price = float(new_item.get("price",0))
    old_price = last["price"]
    new_stock = int(new_item.get("num",0))
    old_stock = last["stock"]

    print(f"\n=====变动检测【{new_item.get('title')}】=====")
    if new_price != old_price:
        print(f"⚠️价格变动!旧价:{old_price} → 新价:{new_price}")
    if new_stock != old_stock:
        print(f"⚠️库存变动!旧库存:{old_stock} → 新库存:{new_stock}")
    if new_price == old_price and new_stock == old_stock:
        print("✅价格库存均无变化")

def monitor_loop():
    """循环监控主逻辑"""
    while True:
        print(f"\n==== {datetime.now().strftime('%Y‑%m‑%d %H:%M:%S')} 执行采集 ====")
        item_info = get_goods_detail(MONITOR_GOODS_ID)
        if item_info:
            check_change(item_info)
            save_to_db(item_info)
        print(f"等待{MONITOR_CYCLE/60}分钟,进入下一轮采集...")
        time.sleep(MONITOR_CYCLE)

启动监控循环:

# 启动持续监控
if __name__ == "__main__":
    init_db()
    monitor_loop()

提示:实际部署可以使用 nohup 或者 systemd 把脚本放后台运行,实现 7*24 小时不间断盯商品。当检测到降价、库存清空,控制台直接输出提醒,业务场景可以继续扩展消息推送。


四、基于历史记录做数据分析与可视化

积累一段时间历史数据后,就可以做数据分析,观察商品价格波动趋势,判断促销节点。下面从数据库读取全部历史记录,绘制价格走势图表。

def analysis_and_plot(goods_id):
    """读取历史数据,数据分析+绘制价格走势图"""
    conn = sqlite3.connect("goods_monitor.db")
    df = pd.read_sql(
        f"SELECT * FROM goods_record WHERE goods_id='{goods_id}' ORDER BY capture_time",
        conn
    )
    conn.close()
    if len(df) == 0:
        print("暂无历史监控数据")
        return

    # 基础统计
    print("\n====历史数据统计摘要====")
    print(f"总采集记录数:{len(df)}")
    print(f"历史最低售价:{df['price'].min()}")
    print(f"历史最高售价:{df['price'].max()}")
    print(f"平均售价:{round(df['price'].mean(),2)}")

    # 绘图设置中文
    plt.rcParams["font.sans‑serif"] = ["SimHei"]
    plt.rcParams["axes.unicode_minus"] = False

    df["capture_time"] = pd.to_datetime(df["capture_time"])
    plt.figure(figsize=(12,6))
    plt.plot(df["capture_time"], df["price"], marker="o", label="实时售价")
    plt.plot(df["capture_time"], df["original_price"], linestyle="‑‑", label="原价")
    plt.title("商品价格历史监控走势")
    plt.xlabel("采集时间")
    plt.ylabel("价格")
    plt.legend()
    plt.xticks(rotation=30)
    plt.tight_layout()
    plt.savefig("price_trend.png", dpi=150)
    print("图表已保存 price_trend.png")
    plt.show()

调用分析函数:

if __name__ == "__main__":
    analysis_and_plot(MONITOR_GOODS_ID)

运行完成后,会输出统计信息,同时在本地生成一张价格趋势图片。运营可以通过这张图看什么时候降价、什么时候恢复原价,辅助判断采购、上架时机。

五、扩展方向

上面的例子只监控单个商品,还可以继续扩展能力:

  1. 批量监控:维护一份商品编号列表,循环遍历批量获取多款竞品数据,一次性入库。

  2. SKU 维度监控:解析返回内容中的规格列表,对每一个不同规格单独记录价格库存,监控不同配置的价差。

  3. 消息推送:检测到变动时调用企业微信 / 钉钉机器人接口,手机实时接收提醒,不用守着控制台。

  4. 导出报表:用 pandas 把数据库记录导出 csv,直接给到运营同事做周报分析。

  5. 异常容错:增加重试逻辑,网络波动自动重试,避免单次网络问题中断整个监控任务。

踩坑经验总结

  1. 不要把采集周期设置过短,过于频繁请求容易触发限流,业务场景一般 15‑60 分钟一次足够。

  2. 拿到的数据里面,部分规格价格存在偏差,业务做决策建议多轮采集交叉核对,不要只看单次快照。

  3. 商品下架、编号失效的时候会返回空结果,代码要做好判空,防止程序直接崩溃。

  4. 如果长期后台运行,需要注意磁盘占用,定期清理过久的历史快照,或者做分表。

写在最后

很多人做电商数据相关开发,大部分时间消耗在页面解析、处理各类访问限制。Open‑Claw 把这些底层脏活全部封装起来,开发者可以把精力全部放在业务逻辑上。

十几行代码完成基础读取,再搭配上 Python 的数据存储、绘图能力,快速拥有一套自用的商品监控分析工具。不管是个人玩家做薅羊毛盯价,还是中小企业做竞品跟踪,这套思路都可以直接复用。


少长咸集

群贤毕至

访客