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的ORM框架中SQLAlchemy库的查询操作的教程
Apr 25 Python
python逐行读写txt文件的实例讲解
Apr 03 Python
python中csv文件的若干读写方法小结
Jul 04 Python
实例讲解Python爬取网页数据
Jul 08 Python
解析Python的缩进规则的使用
Jan 16 Python
python matplotlib实现双Y轴的实例
Feb 12 Python
Python3.5实现的罗马数字转换成整数功能示例
Feb 25 Python
python中selenium操作下拉滚动条的几种方法汇总
Jul 14 Python
Django QuerySet查询集原理及代码实例
Jun 13 Python
Python基于staticmethod装饰器标示静态方法
Oct 17 Python
Python3使用Selenium获取session和token方法详解
Feb 16 Python
python实现银行账户系统
Feb 22 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 foreach、while性能比较
2009/10/15 PHP
Base64在线编码解码实现代码 演示与下载
2011/01/08 PHP
php 文件上传类代码
2011/08/06 PHP
php数组函数序列之array_splice() - 在数组任意位置插入元素
2011/11/07 PHP
ThinkPHP之用户注册登录留言完整实例
2014/07/22 PHP
php中file_exists函数使用详解
2015/05/08 PHP
php curl抓取网页的介绍和推广及使用CURL抓取淘宝页面集成方法
2015/11/30 PHP
PHP实现bitmap位图排序与求交集的方法
2016/07/28 PHP
微信封装的调用微信签名包的类库
2017/06/08 PHP
PHP pthreads v3使用中的一些坑和注意点分析
2020/02/21 PHP
理解JavaScript的caller,callee,call,apply
2009/04/28 Javascript
Javascript 日期处理之时区问题
2009/10/08 Javascript
jQuery1.6 正式版发布并提供下载
2011/05/05 Javascript
web开发人员学习jQuery的6大理由及jQuery的优势介绍
2013/01/03 Javascript
select、radio表单回显功能实现避免使用jquery载入赋值
2013/06/08 Javascript
javascript和HTML5利用canvas构建猜牌游戏实现算法
2013/07/17 Javascript
JQuery实现倒计时按钮具体方法
2013/11/14 Javascript
javascript实现粘贴qq截图功能(clipboardData)
2016/05/29 Javascript
Vue响应式原理详解
2017/04/18 Javascript
Angular2里获取(input file)上传文件的内容的方法
2017/09/05 Javascript
Vuex新手的理解与使用详解
2019/05/31 Javascript
[04:52]第二届DOTA2亚洲邀请赛主赛事第一天比赛集锦:OG娜迦海妖放大配合谜团大中3人
2017/04/02 DOTA
[46:47]完美世界DOTA2联赛PWL S2 FTD vs Magma 第二场 11.20
2020/11/23 DOTA
python自然语言编码转换模块codecs介绍
2015/04/08 Python
python 字符串追加实例
2019/07/20 Python
树莓派极简安装OpenCv的方法步骤
2019/10/10 Python
pycharm通过anaconda安装pyqt5的教程
2020/03/24 Python
python 星号(*)的多种用途
2020/09/21 Python
详解Python Celery和RabbitMQ实战教程
2021/01/20 Python
Python使用cn2an实现中文数字与阿拉伯数字的相互转换
2021/03/02 Python
HTML5 Canvas的常用线条属性值总结
2016/03/17 HTML / CSS
教师党员学习群众路线心得体会
2014/11/04 职场文书
2015年大学学生会工作总结
2015/05/13 职场文书
居住证明范文
2015/06/17 职场文书
傲慢与偏见读书笔记
2015/06/29 职场文书
Angular性能优化之第三方组件和懒加载技术
2021/05/10 Javascript