Python 制作查询商品历史价格的小工具


Posted in Python onOctober 20, 2020

一年一度的双十一就快到了,各种砍价、盖楼、挖现金的口令将在未来一个月内充斥朋友圈、微信群中。玩过多次双十一活动的小编表示一顿操作猛如虎,一看结果2毛5。浪费时间不说而且未必得到真正的优惠,双十一电商的“明降暗升”已经是默认的潜规则了。打破这种规则很简单,可以用 Python 写一个定时监控商品价格的小工具。

Python 制作查询商品历史价格的小工具

思路

  • 第一步抓取商品的价格存入 Python 自带的 SQLite 数据库
  • 每天定时抓取商品价格
  • 使用 pyecharts 模块绘制价格折线图,让低价一目了然

抓取京东价格

从商品详情的页面中打开 F12 控制面板,找到包含 p.3 的链接,在旁边的 preview 面板中可以看到当前商品价格

Python 制作查询商品历史价格的小工具

def get_jd_price(skuId):

  sku_detail_url = 'http://item.jd.com/{}.html'
  sku_price_url = 'https://p.3.cn/prices/get?type=1&skuid=J_{}'

  r = requests.get(sku_detail_url.format(skuId)).content

  soup = BeautifulSoup(r, 'html.parser', from_encoding='utf-8')
  sku_name_div = soup.find('div', class_="sku-name")

  if not sku_name_div:
    print('您输入的商品ID有误!')
    return
  else:
    sku_name = sku_name_div.text.strip()

  r = requests.get(sku_price_url.format(skuId))
  price = json.loads(r.text)[0]['p']

  data = {
    'sku_id': skuId,
    'sku_name': sku_name,
    'price': price
  }
  return data

把抓取的价格存入 sqlite 数据库,使用 PyCharm 的 Database 功能创建一个 sqlite 数据库

Python 制作查询商品历史价格的小工具

Python 制作查询商品历史价格的小工具

最终将数据插入到数据库

# 新增
def insert(data):
  conn = sqlite3.connect('price.db')
  c = conn.cursor()
  sql = 'INSERT INTO price (sku_id,sku_name,price) VALUES ("{}", "{}", "{}")'.format(data.get("sku_id"), data.get("sku_name"), data.get('price') )
  c.execute(sql)
  conn.commit()
  conn.close()

# 查询
def select(sku_id):
  conn = sqlite3.connect('price.db')
  c = conn.cursor()
  sql = 'select sku_id, sku_name, price, time from price where sku_id = "{}" order by time asc'.format(sku_id)
  cursor = c.execute(sql)

  datas = []
  for row in cursor:
    data = {
      'sku_id': row[0],
      'sku_name': row[1],
      'price': row[2],
      'time': row[3]
    }
    datas.append(data)
  conn.close()

  return datas

示例结果

Python 制作查询商品历史价格的小工具

计划任务

使用轻量级的 schedule 模块每天早上 10 点抓取京东价格这一步骤

安装 schedule 模块

pip install schedule
def run_price_job(skuId):

  # 使用不占主线程的方式启动 计划任务
  def run_continuously(interval=1):
    cease_continuous_run = threading.Event()

    class ScheduleThread(threading.Thread):
      @classmethod
      def run(cls):
        while not cease_continuous_run.is_set():
          schedule.run_pending()
          time.sleep(interval)

    continuous_thread = ScheduleThread()
    continuous_thread.start()
    return cease_continuous_run
  
  # 每天10点运行,get_jd_price:任务方法,skuId:任务方法的参数
  schedule.every().day.at("10:00").do(get_jd_price, skuId=skuId)
  run_continuously()

查看历史价格

使用 pytharts 模块绘制折线图,直观的查看每一天的价格差异

datas = select(skuId)

def line(datas):
  x_data = []
  y_data = []
  for data in datas:
    x_data.append(data.get('time'))
    y_data.append(data.get('price'))

  (
    Line()
    .add_xaxis(x_data)
    .add_yaxis(datas[0].get('sku_name'), y_data, is_connect_nones=True)
    .render("商品历史价格.html")
  )

Python 制作查询商品历史价格的小工具

总结

本文抓取了京东商城的价格,小伙伴们也可以修个脚本抓取淘宝的价格。使用 Python 解决生活中的小小痛点,让钱包不再干瘪。

示例代码:

用 Python 制作商品历史价格查询

以上就是Python 制作查询商品历史价格的小工具的详细内容,更多关于python 查询历史价格的资料请关注三水点靠木其它相关文章!

Python 相关文章推荐
python设置检查点简单实现代码
Jul 01 Python
python提示No module named images的解决方法
Sep 29 Python
在Python中使用itertools模块中的组合函数的教程
Apr 13 Python
Python实现控制台输入密码的方法
May 29 Python
Python SqlAlchemy动态添加数据表字段实例解析
Feb 07 Python
python实现批量图片格式转换
Jun 16 Python
12个Python程序员面试必备问题与答案(小结)
Jun 24 Python
基于python实现微信好友数据分析(简单)
Feb 16 Python
小 200 行 Python 代码制作一个换脸程序
May 12 Python
python之语音识别speech模块
Sep 09 Python
python如何调用php文件中的函数详解
Dec 29 Python
教你使用一行Python代码玩遍童年的小游戏
Aug 23 Python
python实现扫雷游戏的示例
Oct 20 #Python
python3排序的实例方法
Oct 20 #Python
关于python tushare Tkinter构建的简单股票可视化查询系统(Beta v0.13)
Oct 19 #Python
15款Python编辑器的优缺点,别再问我“选什么编辑器”啦
Oct 19 #Python
django使用channels实现通信的示例
Oct 19 #Python
python实现测试工具(二)——简单的ui测试工具
Oct 19 #Python
python实现测试工具(一)——命令行发送get请求
Oct 19 #Python
You might like
phpmyadmin的#1251问题
2006/11/25 PHP
PHP防范SQL注入的具体方法详解(测试通过)
2014/05/09 PHP
浅谈thinkphp的实例化模型
2015/01/04 PHP
yii2.0整合阿里云oss删除单个文件的方法
2017/09/19 PHP
php删除一个路径下的所有文件夹和文件的方法
2018/02/07 PHP
javascript 面向对象,实现namespace,class,继承,重载
2009/10/29 Javascript
Javascript中arguments对象详解
2014/10/22 Javascript
javascript去除字符串左右两端的空格
2015/02/05 Javascript
Jsonp post 跨域方案
2015/07/06 Javascript
javascript实现计时器的简单方法
2016/02/21 Javascript
JavaScript数据类型学习笔记分享
2016/09/01 Javascript
JS中使用正则表达式g模式和非g模式的区别
2017/04/01 Javascript
JavaScript全屏和退出全屏事件总结(附代码)
2017/08/17 Javascript
NodeJS设计模式总结【单例模式,适配器模式,装饰模式,观察者模式】
2017/09/06 NodeJs
vue计算属性时v-for处理数组时遇到的一个bug问题
2018/01/21 Javascript
JS使用tween.js动画库实现轮播图并且有切换功能
2018/07/17 Javascript
一文看懂如何简单实现节流函数和防抖函数
2019/09/05 Javascript
解决vue的router组件component在import时不能使用变量问题
2020/07/26 Javascript
利用python3 的pygame模块实现塔防游戏
2019/12/30 Python
浅谈django channels 路由误导
2020/05/28 Python
opencv 阈值分割的具体使用
2020/07/08 Python
使用javascript和HTML5 Canvas画的四渐变色播放按钮效果
2014/04/10 HTML / CSS
斐乐美国官方网站:FILA美国
2019/03/01 全球购物
int和Integer有什么区别
2013/05/25 面试题
应届大学生求职信
2013/12/01 职场文书
信息管理员岗位职责
2013/12/01 职场文书
入学申请自荐信范文
2014/02/26 职场文书
清明节扫墓活动方案
2014/03/02 职场文书
学校运动会霸气口号
2014/06/07 职场文书
母亲节主题班会
2015/08/14 职场文书
学习经验交流会策划书
2015/11/02 职场文书
2016银行招聘自荐信
2016/01/28 职场文书
2016年六一儿童节开幕词
2016/03/04 职场文书
2016年学生会感恩节活动总结
2016/04/01 职场文书
低版本Druid连接池+MySQL驱动8.0导致线程阻塞、性能受限
2021/07/01 MySQL
win10拖拽文件时崩溃怎么解决?win10文件不能拖拽问题解决方法
2022/08/14 数码科技