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读取mp3中ID3信息的方法
Mar 05 Python
Python爬虫辅助利器PyQuery模块的安装使用攻略
Apr 24 Python
Python正则表达式分组概念与用法详解
Jun 24 Python
python机器学习之神经网络(三)
Dec 20 Python
Python直接赋值、浅拷贝与深度拷贝实例分析
Jun 18 Python
python多线程扫描端口(线程池)
Sep 04 Python
pycharm如何实现跨目录调用文件
Feb 28 Python
pyinstaller打包单文件时--uac-admin选项不起作用怎么办
Apr 15 Python
Pytorch使用PIL和Numpy将单张图片转为Pytorch张量方式
May 25 Python
Python pexpect模块及shell脚本except原理解析
Aug 03 Python
Python用SSH连接到网络设备
Feb 18 Python
基于python制作简易版学生信息管理系统
Apr 20 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
php 面试碰到过的问题 在此做下记录
2011/06/09 PHP
php5.3 goto函数介绍和示例
2014/03/21 PHP
PHP时间类完整实例(非常实用)
2015/12/25 PHP
php ci 获取表单中多个同名input元素值的代码
2016/03/25 PHP
ThinkPHP3.2.3框架Memcache缓存使用方法实例总结
2019/04/15 PHP
Yii框架响应组件用法实例分析
2019/09/04 PHP
JavaScript之自定义类型
2012/05/04 Javascript
jQuery.each()用法分享
2012/07/31 Javascript
多个datatable共存造成多个表格的checkbox都被选中
2013/07/11 Javascript
javascript禁用Tab键脚本实例
2013/11/22 Javascript
采用自执行的匿名函数解决for循环使用闭包的问题
2014/09/11 Javascript
jQuery中;function($,undefined) 前面的分号的用处
2014/12/17 Javascript
JavaScript中操作Mysql数据库实例
2015/04/02 Javascript
深入探究使JavaScript动画流畅的一些方法
2015/06/30 Javascript
js实现正则匹配中文标点符号的方法
2015/12/23 Javascript
jQuery div拖拽用法实例
2016/01/14 Javascript
ES6新特性之Symbol类型用法分析
2017/03/31 Javascript
react.js组件实现拖拽复制和可排序的示例代码
2018/08/20 Javascript
jquery实现加载更多"转圈圈"效果(示例代码)
2020/11/09 jQuery
天翼开放平台免费短信验证码接口使用实例
2013/12/18 Python
Python的消息队列包SnakeMQ使用初探
2016/06/29 Python
Python3下错误AttributeError: ‘dict’ object has no attribute’iteritems‘的分析与解决
2017/07/06 Python
Python3中的列表生成式、生成器与迭代器实例详解
2018/06/11 Python
Python实现的建造者模式示例
2018/08/06 Python
使用Python正则表达式操作文本数据的方法
2019/05/14 Python
python 利用jieba.analyse进行 关键词提取
2020/12/17 Python
Python文件操作的面试题
2013/06/22 面试题
大四学生思想汇报
2014/01/13 职场文书
大学同学十年聚会感言
2014/02/21 职场文书
《难忘的泼水节》教学反思
2014/02/27 职场文书
企业元宵节主持词
2014/03/25 职场文书
关于保护环境的建议书
2014/05/13 职场文书
动物科学专业求职信
2014/07/27 职场文书
邹越演讲观后感
2015/06/15 职场文书
《折线统计图》教学反思
2016/02/22 职场文书
八年级地理课件资料及考点知识分享
2019/08/30 职场文书