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使用三角迭代计算圆周率PI的方法
Mar 20 Python
Python实现删除列表中满足一定条件的元素示例
Jun 12 Python
Python输出带颜色的字符串实例
Oct 10 Python
Windows 7下Python Web环境搭建图文教程
Mar 20 Python
python实现在IDLE中输入多行的方法
Apr 19 Python
解决Pycharm下面出现No R interpreter defined的问题
Oct 29 Python
Python 脚本拉取 Docker 镜像问题
Nov 10 Python
python实现tail实时查看服务器日志示例
Dec 24 Python
python 日志 logging模块详细解析
Mar 31 Python
python 双循环遍历list 变量判断代码
May 04 Python
python安装及变量名介绍详解
Dec 12 Python
如何利用python 读取配置文件
Jan 06 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中并发读写文件冲突的解决方案
2013/10/25 PHP
对比分析php中Cookie与Session的异同
2016/02/19 PHP
mac os快速切换多个PHP版本的方法
2017/03/07 PHP
解决Laravel 不能创建 migration 的问题
2019/10/09 PHP
PHP 范围解析操作符(::)用法分析【访问静态成员和类常量】
2020/04/14 PHP
Jquery跨域获得Json的简单实例
2016/05/18 Javascript
详解Bootstrap各式各样的按钮(推荐)
2016/12/13 Javascript
async/await与promise(nodejs中的异步操作问题)
2017/03/03 NodeJs
微信小程序五星评分效果实现代码
2017/04/06 Javascript
基于jQuery实现图片推拉门动画效果的两种方法
2017/08/26 jQuery
在react中使用vuex的示例代码
2018/07/30 Javascript
浅谈layui数据表格判断问题(加入表单元素),设置单元格样式
2019/10/26 Javascript
JS获取表格视图所选行号的ids过程解析
2020/02/21 Javascript
解决vue初始化项目一直停在downloading template的问题
2020/11/09 Javascript
详解vite2.0配置学习(typescript版本)
2021/02/25 Javascript
[51:11]2014 DOTA2国际邀请赛中国区预选赛5.21 LGD-CDEC VS DT
2014/05/22 DOTA
[57:50]DOTA2上海特级锦标赛主赛事日 - 4 胜者组决赛Secret VS Liquid第二局
2016/03/05 DOTA
python socket网络编程步骤详解(socket套接字使用)
2013/12/06 Python
python实现自动登录人人网并访问最近来访者实例
2014/09/26 Python
Django读取Mysql数据并显示在前端的实例
2018/05/27 Python
Django框架使用富文本编辑器Uedit的方法分析
2018/07/31 Python
Python面向对象之继承和组合用法实例分析
2018/08/27 Python
5款Python程序员高频使用开发工具推荐
2019/04/10 Python
python爬虫模拟浏览器访问-User-Agent过程解析
2019/12/28 Python
python re模块匹配贪婪和非贪婪模式详解
2020/02/11 Python
详解python常用命令行选项与环境变量
2020/02/20 Python
python 错误处理 assert详解
2020/04/20 Python
Python打印特殊符号及对应编码解析
2020/05/07 Python
限量版运动鞋和街头服饰:TheDrop
2020/09/06 全球购物
Python如何实现单例模式
2016/06/03 面试题
客服文员岗位职责
2013/11/29 职场文书
自我介绍演讲稿
2014/01/15 职场文书
个人授权委托书
2014/04/03 职场文书
中学优秀班主任事迹材料
2014/05/01 职场文书
Mac环境Nginx配置和访问本地静态资源的实现
2021/03/31 Servers
「海贼王」112.9万粉丝纪念图标公布
2022/03/21 日漫