影刀RPA数据采集实战:京东商品价格监控系统

作者:林焱 | 适合人群:有一定基础的RPA学员 | 预计阅读时间:18分钟


前言

价格监控是电商从业者最常见的需求之一。手动查价既费时又容易遗漏,而用影刀RPA搭建一套全自动价格监控系统,只需一次配置,之后永久自动运行。
在这里插入图片描述

本文从零开始,带你完成:

  • ✅ 多商品价格自动采集
  • ✅ 价格变化检测与记录
  • ✅ 降价自动微信/钉钉推送
  • ✅ 每日价格趋势报告生成

一、需求分析与系统设计

用户故事

作为电商运营,我需要:

  1. 监控自家店铺20款竞品的价格
  2. 当竞品降价超过5%时,立刻收到通知
  3. 每天生成一份价格趋势报告
  4. 在这里插入图片描述

系统架构

┌──────────────────────────────────────────────────┐
│              价格监控系统                          │
│                                                  │
│  📋 商品配置Excel → 读取监控清单                   │
│         ↓                                        │
│  🌐 浏览器 → 采集各商品当前价格                   │
│         ↓                                        │
│  📊 数据比对 → 与历史价格对比                     │
│         ↓                                        │
│  🔔 降价判断 → 超阈值 → 推送通知                  │
│         ↓                                        │
│  📁 写入历史数据库(Excel/SQLite)                  │
│         ↓                                        │
│  📈 生成趋势报告 → 邮件发送                       │
│         ↓                                        │
│  ⏰ 定时循环(每2小时执行一次)                   │
└──────────────────────────────────────────────────┘

拼多多店群自动化报活动上架!

二、商品配置文件设计

新建config.xlsx,包含以下列:

商品ID 商品名称 商品URL 降价阈值(%) 是否启用 上次价格
P001 华为手机A https://item.jd.com/xxxx.html 5 2999
P002 苹果耳机B https://item.jd.com/yyyy.html 3 999
在这里插入图片描述

| P003 | 小米平板C | https://item.jd.com/zzzz.html | 10 | 否 | 1599 |


三、完整流程代码

模块1:读取商品配置

# 读取配置Excel
打开Excel("config.xlsx")
all_config = 读取全部数据(包含表头=True)
headers = all_config[0]
products = []

For row in all_config[1:]:
    if row[4] == "是":  # 只处理"启用"的商品
        products.append({
            "id": row[0],
            "name": row[1],
            "url": row[2],
            "threshold": float(row[3]),
            "last_price": float(row[5]) if row[5] else None
        })

print(f"共加载 {len(products)} 个监控商品")

模块2:采集京东价格

def get_jd_price(url):
    """
    采集京东商品当前价格
    返回: float 价格,失败返回 None
    """
    Try:
        打开浏览器(url, 隐藏=True)  # 无头模式
        
        # 等待价格元素加载
        等待元素出现(".p-price .price", 超时=10)
        
        # 获取价格文本
        price_text = 获取元素文本(".p-price .price")
        
        # 清理非数字字符,转为浮点数
        ![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/8daefcba3cf247c7b0e9081bfdce65cf.png#pic_center)

        price = float(price_text.replace("¥", "").replace(",", "").strip())
        
        关闭浏览器()
        return price
        
    Catch (超时错误):
        写入日志(f"页面加载超时: {url}")
        关闭浏览器()
        return None
    Catch (元素不存在):
        写入日志(f"价格元素未找到: {url}")
        关闭浏览器()
        return None

模块3:价格对比与告警

alerts = []  # 告警列表

For product in products:
    current_price = get_jd_price(product["url"])
    
    if current_price is None:
        continue
    
    last_price = product["last_price"]
    product_name = product["name"]
    
    # 记录当前价格
    更新配置Excel(product["id"], "当前价格", current_price)
    写入价格历史(product["id"], current_price, 当前时间)
    
    # 对比价格
    if last_price is not None and last_price > 0:
        change_rate = (last_price - current_price) / last_price * 100
        
        if change_rate >= product["threshold"]:
            # 降价超过阈值!触发告警
            alert = {
                "name": product_name,
                "last": last_price,
                "current": current_price,
                "drop": change_rate,
                "url": product["url"]
            }
            alerts.append(alert)
            写入日志(f"⚠️ 降价告警:{product_name} 降价{change_rate:.1f}%")
        elif change_rate < -5:
            # 涨价超过5%,记录不告警
            写入日志(f"📈 涨价:{product_name} 涨价{-change_rate:.1f}%")
    
    # 更新"上次价格"
    更新配置Excel(product["id"], "上次价格", current_price)
    
    # 避免频繁请求被封,每个商品间隔2-5秒
    随机等待(2000, 5000)

模块4:发送降价通知

if len(alerts) > 0:
    # 构造通知内容
    msg_lines = ["🎉 **价格降低告警**\n"]
    
    For alert in alerts:
        msg_lines.append(
            f"📦 **{alert['name']}**\n"
            f"   原价:¥{alert['last']:,.0f}\n"
            f"   现价:¥{alert['current']:,.0f}\n"
            f"   降幅:🔴 **{alert['drop']:.1f}%**\n"
            f"   链接:{alert['url']}\n"
        )
    
    msg = "\n".join(msg_lines)
    
    # 发送到钉钉群
    钉钉Webhook推送(
        token="YOUR_WEBHOOK_TOKEN",
        消息类型="markdown",
        标题="价格降低告警",
        内容=msg
    )
    
    # 同时发送邮件
    发送邮件(
        收件人="team@company.com",
        主题=f"价格告警 - {len(alerts)}个商品降价 [{今日日期}]",
        正文=msg,
        正文格式="markdown"
    )

模块5:生成每日趋势报告

def generate_daily_report():
    """每天晚上8点生成价格趋势报告"""
    
    # 从历史数据库读取今日数据
    今日数据 = 查询价格历史(日期=今日日期)
    
    # 统计
    涨价商品 = [p for p in 今日数据 if p["变化"] > 0]
    降价商品 = [p for p in 今日数据 if p["变化"] < 0]
    无变化商品 = [p for p in 今日数据 if p["变化"] == 0]
    
    # 生成Excel报告
    wb = 创建Excel()
    
    # Sheet1:今日概况
    概况数据 = [
        ["统计项", "数量"],
        ["监控商品总数", len(今日数据)],
        ["今日降价", len(降价商品)],
        ["今日涨价", len(涨价商品)],
        ["价格未变", len(无变化商品)],
    ]
    写入Sheet(wb, "今日概况", 概况数据)
    
    # Sheet2:降价商品详情(按降幅排序)
    降价商品.sort(key=lambda x: x["变化"])  # 降幅从大到小
    写入Sheet(wb, "降价商品", 降价商品)
    
    # Sheet3:价格趋势图(最近7天)
    For product in products[:10]:  # 最多展示前10个商品
        七日数据 = 查询最近7天价格(product["id"])
        添加趋势图(wb, f"{product['name']}_趋势", 七日数据)
    
    保存Excel(wb, f"价格报告_{今日日期}.xlsx")
    
    # 发邮件
    发送邮件(
        收件人="boss@company.com",
        主题=f"商品价格日报 - {今日日期}",
        正文=f"今日共监控{len(今日数据)}个商品,{len(降价商品)}个降价,请查看附件。",
        附件=[f"价格报告_{今日日期}.xlsx"]
    )

在这里插入图片描述

四、反爬虫应对策略

京东有一定的反爬机制,需要注意以下几点:

策略1:随机请求间隔

import random

# 每次请求后等待随机时间(2-8秒)
等待时间 = random.uniform(2, 8)
等待(等待时间 * 1000)

策略2:使用真实浏览器而非HTTP请求

影刀RPA直接控制Chrome浏览器,京东看到的是正常浏览器行为,比Python requests更难被识别。

在这里插入图片描述

策略3:绕过登录墙

京东部分价格需要登录才能看到(会员价/Plus价),需要先登录:

# 先检查是否已登录
if 元素是否存在(".nickname"):
    print("已登录")
else:
    打开页面("https://passport.jd.com/new/login.aspx")
    输入账号()
    输入密码()
    点击登录()
    处理滑块验证()  # 如果有的话
    等待登录完成()

策略4:IP被封时的处理

Catch (访问被拒绝错误):
    写入日志("IP可能被限制,等待30分钟后重试")
    等待(30 * 60 * 1000)  # 等待30分钟
    重试当前商品()

在这里插入图片描述

五、数据存储方案选择

TEMU店群矩阵自动化运营核价报活动

方案 优点 缺点 适用场景
Excel 直观,可视化 数据量大时慢 <10000条数据
SQLite 查询快,零配置 不能多进程写 中等数据量
MySQL 高性能,多并发 需要安装配置 大量数据,多用户

推荐:SQLite(适合个人/小团队使用)

import sqlite3

# 创建数据库和表
conn = sqlite3.connect("price_history.db")
cursor = conn.cursor()

cursor.execute("""
CREATE TABLE IF NOT EXISTS price_records (
    id INTEGER PRIMARY KEY AUTOINCREMENT,
    product_id TEXT,
    product_name TEXT,
    price REAL,
    record_time DATETIME DEFAULT CURRENT_TIMESTAMP,
    change_rate REAL
)
""")
conn.commit()

在这里插入图片描述

六、定时任务设置

在影刀中设置定时执行:

任务名:商品价格监控
执行频率:每2小时执行一次
执行时间:00:00, 02:00, 04:00, 06:00, 08:00, 10:00, 12:00, 14:00, 16:00, 18:00, 20:00, 22:00
特别设置:每天晚上20:00,执行完采集后额外执行生成日报子流程

七、运行效果展示

[2026-06-10 08:00:01] 开始执行价格监控任务
[2026-06-10 08:00:03] 已加载 20 个监控商品
[2026-06-10 08:00:15] 商品P001 华为手机A: ¥2799(↓6.7%,原价¥2999)⚠️触发告警
[2026-06-10 08:00:23] 商品P002 苹果耳机B: ¥999(持平)
[2026-06-10 08:00:31] 商品P003 小米平板C(已禁用,跳过)
...
[2026-06-10 08:03:45] 采集完成,共20个商品
![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/4e4a7dbb30814538a96b674028cb631a.png#pic_center)

[2026-06-10 08:03:46] 本次共发现3个降价告警
[2026-06-10 08:03:48] 告警已发送到钉钉群
[2026-06-10 08:03:49] 价格历史已写入数据库
[2026-06-10 08:03:50] 本次任务执行完毕(耗时3分49秒)

总结

本文构建了一个完整的商品价格监控系统:

  1. 配置化 — Excel配置文件,无需修改代码即可调整监控商品
  2. 自动化 — 定时执行,全程无需人工干预
  3. 智能告警 — 降价超阈值立即推送通知
  4. 数据积累 — 历史价格入库,支持趋势分析
  5. 报告输出 — 每日自动生成Excel趋势报告

这套系统可以扩展到淘宝、天猫、拼多多等平台,只需修改采集模块中的URL和CSS选择器。


📝 本文作者:林焱 | 专注影刀RPA教程与自动化实战
在这里插入图片描述

Logo

电商企业物流数字化转型必备!快递鸟 API 接口,72 小时快速完成物流系统集成。全流程实战1V1指导,营造开放的API技术生态圈。

更多推荐