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构造icmp echo请求和实现网络探测器功能代码分享
Jan 10 Python
Python中操作MySQL入门实例
Feb 08 Python
python3.6 实现AES加密的示例(pyCryptodome)
Jan 10 Python
python使用Flask操作mysql实现登录功能
May 14 Python
python使用循环打印所有三位数水仙花数的实例
Nov 13 Python
Python基础教程之if判断,while循环,循环嵌套
Apr 25 Python
python实战串口助手_解决8串口多个发送的问题
Jun 12 Python
Python如何实现强制数据类型转换
Nov 22 Python
python实现12306登录并保存cookie的方法示例
Dec 17 Python
Pycharm 跳转回之前所在页面的操作
Feb 05 Python
Django利用AJAX技术实现博文实时搜索
May 06 Python
Python Matplotlib绘制条形图的全过程
Oct 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
PHP日期时间函数的高级应用技巧
2009/05/16 PHP
php学习之运算符相关概念
2011/06/09 PHP
关于js与php互相传值的介绍
2013/06/25 PHP
php实例分享之html转为rtf格式
2014/06/02 PHP
php输入流php://input使用浅析
2014/09/02 PHP
PHP 数组遍历foreach语法结构及实例
2016/06/13 PHP
Netbeans 8.2与PHP相关的新特性介绍
2016/10/08 PHP
Laravel 错误提示本地化的实现
2019/10/22 PHP
javascript五图轮播切换实用版
2012/08/17 Javascript
页面装载js及性能分析方法介绍
2014/03/21 Javascript
js兼容火狐显示上传图片预览效果的方法
2015/05/21 Javascript
javascript仿百度输入框提示自动下拉补全
2016/01/07 Javascript
jquery对复选框(checkbox)的操作汇总
2016/01/13 Javascript
浅谈bootstrap源码分析之scrollspy(滚动侦听)
2016/06/06 Javascript
AngularJS用户选择器指令实例分析
2016/11/04 Javascript
weUI应用之JS常用信息提示弹层的封装
2016/11/21 Javascript
原生和jQuery的ajax用法详解
2017/01/23 Javascript
bootstrap table操作技巧分享
2017/02/15 Javascript
JS使用JSON.parse(),JSON.stringify()实现对对象的深拷贝功能分析
2019/03/06 Javascript
Vue extend的基本用法(实例详解)
2019/12/09 Javascript
Vue.js中使用Vuex实现组件数据共享案例
2020/07/31 Javascript
[36:52]DOTA2真视界:基辅特锦赛总决赛
2017/05/21 DOTA
使用Python通过win32 COM打开Excel并添加Sheet的方法
2018/05/02 Python
python使用numpy读取、保存txt数据的实例
2018/10/14 Python
python 通过SSHTunnelForwarder隧道连接redis的方法
2019/02/19 Python
详解window.open被浏览器拦截的解决方案
2019/07/18 HTML / CSS
世界上最大的在线旅行社新加坡网站:Expedia新加坡
2016/08/25 全球购物
白俄罗斯大卖场:21vek.by
2019/07/25 全球购物
Jacadi Paris英国官网:法国童装品牌
2019/08/09 全球购物
生产车间主任的个人自我鉴定
2013/10/25 职场文书
白酒市场开发计划书
2014/01/09 职场文书
幼儿园教师教学反思
2014/02/06 职场文书
煤矿安全保证书
2015/02/27 职场文书
解决Goland 同一个package中函数互相调用的问题
2021/05/06 Golang
详解Vue的options
2021/05/15 Vue.js
mysql分组后合并显示一个字段的多条数据方式
2022/01/22 MySQL