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中操作列表之List.append()方法的使用
May 20 Python
python  Django中的apps.py的目的是什么
Oct 15 Python
scrapy-redis源码分析之发送POST请求详解
May 15 Python
python实现批量视频分帧、保存视频帧
May 31 Python
PyQt5重写QComboBox的鼠标点击事件方法
Jun 25 Python
python实现切割url得到域名、协议、主机名等各个字段的例子
Jul 25 Python
tensorflow实现打印ckpt模型保存下的变量名称及变量值
Jan 04 Python
关于Tensorflow 模型持久化详解
Feb 12 Python
python 使用递归实现打印一个数字的每一位示例
Feb 27 Python
Python实现图片查找轮廓、多边形拟合、最小外接矩形代码
Jul 14 Python
详解python模块pychartdir安装及导入问题
Oct 22 Python
matplotlib之属性组合包(cycler)的使用
Feb 24 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
《超神学院》霸气归来, 天使彦上演维多利亚的秘密
2020/03/02 国漫
PHP实现多条件查询实例代码
2010/07/17 PHP
PHP 5.3 下载时 VC9、VC6、Thread Safe、Non Thread Safe的区别分析
2011/03/28 PHP
php面向对象编程self和static的区别
2016/05/08 PHP
PHP+Apache实现二级域名之间共享cookie的方法
2019/07/24 PHP
JS如何判断移动端访问设备并解析对应CSS
2013/11/27 Javascript
javascript实现回到顶部特效
2015/05/06 Javascript
JavaScript实现带标题的图片轮播特效
2015/05/20 Javascript
jquery中ready()函数执行的时机和window的load事件比较
2015/06/22 Javascript
js简单实现Select互换数据的方法
2015/08/17 Javascript
jquery网页加载进度条的实现
2017/06/01 jQuery
原生JS+Canvas实现五子棋游戏实例
2017/06/19 Javascript
详解JavaScript按概率随机生成事件
2017/08/02 Javascript
完美解决mui框架off-canvas侧滑超出部分隐藏无法滚动的问题
2018/01/25 Javascript
jQuery实现的页面弹幕效果【测试可用】
2018/08/17 jQuery
VuePress 快速踩坑小结
2019/02/14 Javascript
React+Antd+Redux实现待办事件的方法
2019/03/14 Javascript
vue实现路由切换改变title功能
2019/05/28 Javascript
微信小程序反编译的实现
2020/12/10 Javascript
python实现逆波兰计算表达式实例详解
2015/05/06 Python
Python基于列表模拟堆栈和队列功能示例
2018/01/05 Python
python判断一个集合是否为另一个集合的子集方法
2018/05/04 Python
python paramiko利用sftp上传目录到远程的实例
2019/01/03 Python
详解Python连接MySQL数据库的多种方式
2019/04/16 Python
Django中使用极验Geetest滑动验证码过程解析
2019/07/31 Python
在Python中预先初始化列表内容和长度的实现
2019/11/28 Python
python3.7通过thrift操作hbase的示例代码
2020/01/14 Python
python实现逆滤波与维纳滤波示例
2020/02/26 Python
scrapy爬虫:scrapy.FormRequest中formdata参数详解
2020/04/30 Python
Python代码需要缩进吗
2020/07/01 Python
苏格兰在线威士忌商店:The Whisky Barrel
2019/05/07 全球购物
职专应届生求职信
2013/11/16 职场文书
干部考察材料范文
2014/12/24 职场文书
关于迟到的检讨书
2015/05/06 职场文书
CSS3 制作精美的定价表
2021/04/06 HTML / CSS
MySQL图形化管理工具Navicat安装步骤
2021/12/04 MySQL