当前位置: 首页 > news >正文

Python实现京东商品价格监控系统:API+定时任务

你想要用 Python 搭建一套「京东商品价格监控系统」,核心是通过 API 获取商品价格,结合定时任务实现自动监控,当价格低于设定阈值时触发告警(如弹窗 / 邮件)。我会提供完整可运行的代码,涵盖「价格获取 → 定时监控 → 阈值判断 → 告警通知」全流程,兼顾新手友好性和实用性。

一、核心设计思路

  1. 技术栈requests(调用 API) +schedule(定时任务) +plyer(桌面弹窗告警) +smtplib(邮件告警);
  2. 核心流程

  3. 关键特性:支持多商品监控、价格日志记录、多重告警方式、异常自动重试。

二、前置准备

1. 安装依赖库

bash

运行

# 核心依赖:API请求 + 定时任务 + 桌面弹窗 + 邮件发送 pip install requests schedule plyer python-dotenv
2. 获取 API 密钥(聚合数据)

参考之前的步骤,关注博主领取「京东商品详情 API」的AppKey(免费试用足够新手使用)。

3. 配置文件(可选,更安全)

创建.env文件,存放敏感配置(避免硬编码):

ini

# .env 文件内容 JD_API_KEY=你的聚合数据AppKey # 邮件告警配置(可选,不用邮件则留空) EMAIL_SENDER=你的邮箱@163.com EMAIL_PASSWORD=你的邮箱授权码(非登录密码) EMAIL_RECEIVER=接收告警的邮箱@qq.com SMTP_SERVER=smtp.163.com SMTP_PORT=465

三、完整监控系统代码

python

运行

import requests import schedule import time import json import os from datetime import datetime from plyer import notification import smtplib from email.mime.text import MIMEText from email.header import Header from dotenv import load_dotenv # 加载.env配置文件 load_dotenv() # ===================== 全局配置(可根据需求修改) ===================== # API配置 JD_API_KEY = os.getenv("JD_API_KEY", "你的聚合数据AppKey") # 优先从.env读取 JD_API_URL = "https://v.juhe.cn/jd/item/detail" # 监控商品列表:{商品ID: (商品名称, 价格阈值)} MONITOR_ITEMS = { "100060195820": ("京东京造保温杯", 90.0), # 商品ID: (名称, 阈值) "100080907904": ("小米充电宝", 80.0), } # 监控频率(单位:分钟) CHECK_INTERVAL = 5 # 日志文件路径 LOG_FILE = "jd_price_monitor.log" # 邮件告警配置(从.env读取) EMAIL_CONFIG = { "sender": os.getenv("EMAIL_SENDER"), "password": os.getenv("EMAIL_PASSWORD"), "receiver": os.getenv("EMAIL_RECEIVER"), "smtp_server": os.getenv("SMTP_SERVER", "smtp.163.com"), "smtp_port": int(os.getenv("SMTP_PORT", 465)) } # ====================================================================== def get_jd_item_price(sku_id): """ 调用京东API获取商品当前价格 :param sku_id: 商品ID :return: (价格浮点数, 商品名称) 或 (None, None) """ params = { "key": JD_API_KEY, "sku_id": sku_id } headers = { "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36" } try: response = requests.get(JD_API_URL, params=params, headers=headers, timeout=10) if response.status_code == 200: result = response.json() if result["error_code"] == 0: item_data = result["result"] price = float(item_data.get("price", 0.0)) # 转为浮点数便于比较 title = item_data.get("title", f"商品{sku_id}") return price, title else: log(f"API调用失败:{result['reason']}(商品ID:{sku_id})", level="ERROR") else: log(f"HTTP请求失败,状态码:{response.status_code}(商品ID:{sku_id})", level="ERROR") except Exception as e: log(f"获取价格异常:{str(e)}(商品ID:{sku_id})", level="ERROR") return None, None def log(content, level="INFO"): """记录监控日志""" log_time = datetime.now().strftime("%Y-%m-%d %H:%M:%S") log_content = f"[{log_time}] [{level}] {content}\n" # 打印到控制台 print(log_content.strip()) # 写入日志文件 with open(LOG_FILE, "a", encoding="utf-8") as f: f.write(log_content) def send_desktop_notification(title, message): """发送桌面弹窗告警""" try: notification.notify( title=title, message=message, app_name="京东价格监控", timeout=10 # 弹窗显示10秒 ) except Exception as e: log(f"桌面弹窗告警失败:{str(e)}", level="ERROR") def send_email_notification(item_name, current_price, threshold): """发送邮件告警(需配置邮箱信息)""" if not all([EMAIL_CONFIG["sender"], EMAIL_CONFIG["password"], EMAIL_CONFIG["receiver"]]): log("邮箱配置不完整,跳过邮件告警", level="WARNING") return try: # 构造邮件内容 subject = f"【京东价格监控】{item_name}降价啦!" body = f""" <p>商品名称:{item_name}</p> <p>当前价格:{current_price}元</p> <p>设定阈值:{threshold}元</p> <p>告警时间:{datetime.now().strftime('%Y-%m-%d %H:%M:%S')}</p> """ msg = MIMEText(body, "html", "utf-8") msg["From"] = Header(EMAIL_CONFIG["sender"], "utf-8") msg["To"] = Header(EMAIL_CONFIG["receiver"], "utf-8") msg["Subject"] = Header(subject, "utf-8") # 发送邮件 with smtplib.SMTP_SSL(EMAIL_CONFIG["smtp_server"], EMAIL_CONFIG["smtp_port"]) as server: server.login(EMAIL_CONFIG["sender"], EMAIL_CONFIG["password"]) server.sendmail(EMAIL_CONFIG["sender"], EMAIL_CONFIG["receiver"], msg.as_string()) log(f"邮件告警发送成功(接收人:{EMAIL_CONFIG['receiver']})") except Exception as e: log(f"邮件告警失败:{str(e)}", level="ERROR") def check_price(): """价格检查核心逻辑""" log("开始执行价格检查任务") for sku_id, (item_name, threshold) in MONITOR_ITEMS.items(): # 获取当前价格 current_price, real_item_name = get_jd_item_price(sku_id) if current_price is None: continue # 获取价格失败,跳过 # 记录当前价格 log(f"{real_item_name} 当前价格:{current_price}元(阈值:{threshold}元)") # 判断是否低于阈值 if current_price < threshold: alert_msg = f"{real_item_name} 当前价格{current_price}元,低于设定阈值{threshold}元!" log(alert_msg, level="ALERT") # 触发告警 send_desktop_notification("价格告警", alert_msg) send_email_notification(real_item_name, current_price, threshold) log("价格检查任务执行完成") def run_monitor(): """启动监控系统""" log("===== 京东价格监控系统启动 =====") log(f"监控商品数量:{len(MONITOR_ITEMS)}") log(f"检查频率:每{CHECK_INTERVAL}分钟") # 立即执行一次检查 check_price() # 配置定时任务 schedule.every(CHECK_INTERVAL).minutes.do(check_price) # 持续运行 while True: schedule.run_pending() time.sleep(60) # 每秒检查一次定时任务 if __name__ == "__main__": try: run_monitor() except KeyboardInterrupt: log("===== 京东价格监控系统手动停止 =====") except Exception as e: log(f"监控系统异常退出:{str(e)}", level="CRITICAL")

四、代码核心说明

1. 关键功能模块

表格

函数作用核心亮点
get_jd_item_price获取商品价格异常捕获 + 结果校验,失败返回 None,不影响整体监控
log日志记录控制台 + 文件双输出,便于排查问题
send_desktop_notification桌面弹窗跨平台支持(Windows/macOS/Linux),无需额外配置
send_email_notification邮件告警支持 SSL 加密,配置灵活,缺省则自动跳过
check_price价格检查遍历所有监控商品,阈值判断 + 告警触发
run_monitor启动监控立即执行 + 定时任务,持续运行不中断
2. 新手必改配置
  1. MONITOR_ITEMS:替换为你要监控的商品 ID、名称和价格阈值;
  2. CHECK_INTERVAL:修改监控频率(建议≥5 分钟,避免 API 调用超限);
  3. .env文件:填写 API 密钥和邮箱信息(邮件告警需配置)。
3. 避坑要点
  • API 调用限制:聚合数据免费版有调用次数限制(约 100 次 / 天),建议频率≥5 分钟;
  • 邮箱授权码:不是登录密码,需在邮箱设置中开启 SMTP 并生成授权码(如 163 邮箱);
  • 商品 ID 提取:从京东商品 URL 中提取(如https://item.jd.com/100060195820.html中的100060195820);
  • 价格格式:API 返回的价格是字符串,代码中已转为浮点数,避免字符串比较错误。

五、运行与使用

1. 直接运行

bash

运行

python jd_price_monitor.py

运行后效果:

plaintext

[2026-02-10 15:30:00] [INFO] ===== 京东价格监控系统启动 ===== [2026-02-10 15:30:00] [INFO] 监控商品数量:2 [2026-02-10 15:30:00] [INFO] 检查频率:每5分钟 [2026-02-10 15:30:00] [INFO] 开始执行价格检查任务 [2026-02-10 15:30:01] [INFO] 京东京造保温杯 当前价格:89.9元(阈值:90.0元) [2026-02-10 15:30:01] [ALERT] 京东京造保温杯 当前价格89.9元,低于设定阈值90.0元! [2026-02-10 15:30:01] [INFO] 邮件告警发送成功(接收人:xxx@qq.com) [2026-02-10 15:30:02] [INFO] 小米充电宝 当前价格:85.0元(阈值:80.0元) [2026-02-10 15:30:02] [INFO] 价格检查任务执行完成
2. 后台运行(Windows)

创建start.bat文件,实现后台运行(关闭窗口不停止):

bat

@echo off pythonw jd_price_monitor.py exit

六、进阶优化(可选)

  1. 多线程监控:每个商品单独线程获取价格,提升效率(适合监控大量商品);
  2. 价格趋势记录:将每次价格存入 CSV / 数据库,生成价格走势图;
  3. 配置热更新:无需重启程序,修改MONITOR_ITEMS即可生效;
  4. 钉钉 / 微信告警:对接钉钉机器人 / 企业微信,实现即时通讯告警;
  5. 失败重试:获取价格失败时,自动重试 1-2 次,避免漏检。

总结

  1. 核心逻辑:通过schedule实现定时任务,调用京东 API 获取价格,阈值判断后触发弹窗 / 邮件告警;
  2. 关键配置:修改MONITOR_ITEMS添加监控商品,配置.env文件填写 API 密钥和邮箱信息;
  3. 稳定性保障:完善的日志记录 + 异常捕获,即使单个商品获取失败,不影响整体监控;
  4. 易用性:新手只需修改少量配置即可运行,支持桌面 / 邮件双重告警,满足日常监控需求。

这套系统完全适配个人用户的价格监控需求,代码结构清晰,可根据自身需求灵活扩展功能。

http://www.jsqmd.com/news/367833/

相关文章:

  • Java毕设选题推荐:基于Springboot+vue居民健康和慢性病管理信息系统基于springboot的慢性病健康管理系统的设计与实现【附源码、mysql、文档、调试+代码讲解+全bao等】
  • 深度实战:YashanDB 主备库手动搭建与OM纳管全流程
  • 189k上下文,四卡T10(Turing, SM75)部署Qwen3-Coder-Next-AWQ-4bit模型
  • 2026.2.1总结
  • STM32_LED相关
  • 计算机Java毕设实战--基于微信小程序的网络教学资源学习系统基于springboot的网络课程学习系统小程序【完整源码+LW+部署说明+演示视频,全bao一条龙等】
  • Doris在用户行为分析中的应用:大数据场景实践
  • 为什么有些域名不能正常访问?
  • python+django基于大数据的房价数据分析vue_爬虫可视化
  • vue 甘特图 vxe-gantt 设置每个进度条分为计划和实际两条,实现上下分布任务条
  • 计算机Java毕设实战-基于springboot的慢性病健康知识科普管理系统的设计与实现【完整源码+LW+部署说明+演示视频,全bao一条龙等】
  • 计算机Java毕设实战-基于springboot的中医五行音乐失眠治疗小程序【完整源码+LW+部署说明+演示视频,全bao一条龙等】
  • 手机连接树莓派pico rp2040示波器 scoppy-pico
  • 域名卖不出去,要不要考虑委托或经纪出售?
  • 瑞幸咖啡 x 阿里云合作共创:AI 推荐让瑞幸咖啡“更懂你
  • 深圳众擎机器人开启全球首个双足机器人格斗联赛URKL:140万美元金腰带背后,双足格斗如何改写机器人行业未来?
  • DOS叙事环与意义行为原生论:一个智能时代意义哲学的重构、对话与导航
  • flask国内python招聘职位可视化数据分析vue_ka8v0爬虫可视化
  • 前端工程化 - gitlab - MT
  • Python SQLite3 查询结果返回字典的完整解决方案
  • 【每日一题】 LeetCode 3719. 最长平衡子数组 I
  • Flink时间语义全解析:Event Time、Processing Time和Ingestion Time
  • python+django图片相册推荐系统可视化大屏vue_sdtwv 爬虫可视化
  • 能源管理AI优化:从POC到规模化应用的完整路径
  • 大数据领域数据服务:优化业务决策的有效途径
  • Cesium进阶教程(1)在cesium后处理中使用shadertoy的代码
  • U-Net登上Nature封面!谷歌这波颠覆性改进太值得学习了
  • Cesium进阶教程(2)线性高度雾
  • JVM的内存结构
  • 《effective python》- python默认参数