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中的错误处理
Apr 10 Python
Python简单检测文本类型的2种方法【基于文件头及cchardet库】
Sep 18 Python
Python错误提示:[Errno 24] Too many open files的分析与解决
Feb 16 Python
python机器学习之神经网络(一)
Dec 20 Python
儿童学习python的一些小技巧
May 27 Python
解决Python plt.savefig 保存图片时一片空白的问题
Jan 10 Python
用python一行代码得到数组中某个元素的个数方法
Jan 28 Python
三步实现Django Paginator分页的方法
Jun 11 Python
python multiprocessing模块用法及原理介绍
Aug 20 Python
在python image 中实现安装中文字体
May 16 Python
解决Windows下python和pip命令无法使用的问题
Aug 31 Python
ROS系统将python包编译为可执行文件的简单步骤
Jul 25 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/04/09 欧美动漫
写php分页时出现的Fatal error的解决方法
2011/04/18 PHP
PHP生成条形图的方法
2014/12/10 PHP
Zend Framework动作助手Json用法实例分析
2016/03/05 PHP
ThinkPHP的常用配置选项汇总
2016/03/24 PHP
XmlUtils JS操作XML工具类
2009/10/01 Javascript
javascript与webservice的通信实现代码
2010/12/25 Javascript
js鼠标滑过弹出层的定位IE6bug解决办法
2012/12/26 Javascript
jCallout 轻松实现气泡提示功能
2013/09/22 Javascript
js简单实现用户注册信息的校验代码
2013/11/15 Javascript
解决Jquery向页面append新元素之后事件的绑定问题
2015/03/16 Javascript
DOM事件阶段以及事件捕获与事件冒泡先后执行顺序(图文详解)
2015/08/18 Javascript
Three.js学习之文字形状及自定义形状
2016/08/01 Javascript
JavaScript中使用import 和require打包后实现原理分析
2018/03/07 Javascript
vue下拉菜单组件(含搜索)的实现代码
2018/11/25 Javascript
vue.js使用v-model实现表单元素(input) 双向数据绑定功能示例
2019/03/08 Javascript
Python 字符串操作方法大全
2014/03/11 Python
python简单实现基数排序算法
2015/05/16 Python
深入理解Django的自定义过滤器
2017/10/17 Python
python实现手机通讯录搜索功能
2018/02/22 Python
Python读取数据集并消除数据中的空行方法
2018/07/12 Python
使用Django连接Mysql数据库步骤
2019/01/15 Python
python pillow模块使用方法详解
2019/08/30 Python
From CSV to SQLite3 by python 导入csv到sqlite实例
2020/02/14 Python
django 扩展user用户字段inlines方式
2020/03/30 Python
HTML5 video标签(播放器)学习笔记(二):播放控制
2015/04/24 HTML / CSS
Ariat官网:美国马靴和服装品牌
2019/12/16 全球购物
12岁生日感言
2014/01/21 职场文书
职工运动会感言
2014/02/07 职场文书
2014高三学生考试作弊检讨书
2014/12/14 职场文书
档案接收函格式
2015/01/30 职场文书
教师党员个人自我评价
2015/03/04 职场文书
义卖募捐活动总结
2015/05/09 职场文书
创业计划书之健康营养产业
2019/10/15 职场文书
Python实现简单的猜单词
2021/06/15 Python
基于Python实现股票收益率分析
2022/04/02 Python