基于Python爬取京东双十一商品价格曲线


Posted in Python onOctober 23, 2020

一年一度的双十一就快到了,各种砍价、盖楼、挖现金的口令将在未来一个月内充斥朋友圈、微信群中。玩过多次双十一活动的小编表示一顿操作猛如虎,一看结果2毛5。浪费时间不说而且未必得到真正的优惠,双十一电商的“明降暗升”已经是默认的潜规则了。打破这种规则很简单,可以用 Python 写一个定时监控商品价格的小工具。

思路第一步抓取商品的价格存入 Python 自带的 SQLite 数据库每天定时抓取商品价格使用 pyecharts 模块绘制价格折线图,让低价一目了然

抓取京东价格

从商品详情的页面中打开 F12 控制面板,找到包含 p.3 的链接,在旁边的 preview 面板中可以看到当前商品价格

基于Python爬取京东双十一商品价格曲线

defget_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中由于logging模块误用导致的内存泄露
Apr 23 Python
Python functools模块学习总结
May 09 Python
Python实现比较两个列表(list)范围
Jun 12 Python
python2.7安装图文教程
Mar 13 Python
Python之读取TXT文件的方法小结
Apr 27 Python
Python实现的查询mysql数据库并通过邮件发送信息功能
May 17 Python
利用python如何处理百万条数据(适用java新手)
Jun 06 Python
python正则表达式去除两个特殊字符间的内容方法
Dec 24 Python
Python实现E-Mail收集插件实例教程
Feb 06 Python
Python面向对象程序设计之类的定义与继承简单示例
Mar 18 Python
pow在python中的含义及用法
Jul 11 Python
通过实例简单了解Python中yield的作用
Dec 11 Python
Python绘图实现台风路径可视化代码实例
Oct 23 #Python
Python实现JS解密并爬取某音漫客网站
Oct 23 #Python
解决Python 写文件报错TypeError的问题
Oct 23 #Python
python 利用Pyinstaller打包Web项目
Oct 23 #Python
python logging模块的使用详解
Oct 23 #Python
Pycharm自动添加文件头注释和函数注释参数的方法
Oct 23 #Python
Python中免验证跳转到内容页的实例代码
Oct 23 #Python
You might like
PHP安全上传图片的方法
2015/03/21 PHP
如何写php守护进程(Daemon)
2015/12/30 PHP
PHP对象克隆clone用法示例
2016/09/28 PHP
thinkPHP中volist标签用法示例
2016/12/06 PHP
浏览器无法运行JAVA脚本的解决方法
2008/01/09 Javascript
extJs 文本框后面加上说明文字+下拉列表选中值后触发事件
2009/11/27 Javascript
取得窗口大小 兼容所有浏览器的js代码
2011/08/09 Javascript
Js实现双击鼠标自动滚动屏幕的示例代码
2013/12/14 Javascript
js自动查找select下拉的菜单并选择(示例代码)
2014/02/26 Javascript
jQuery对象和DOM对象之间相互转换的方法介绍
2015/02/28 Javascript
微信小程序 http请求详细介绍
2016/10/09 Javascript
JavaScript仿聊天室聊天记录
2016/12/27 Javascript
AngularJS中update两次出现$promise属性无法识别的解决方法
2017/01/05 Javascript
浅谈JS如何实现真正的对象常量
2017/06/25 Javascript
JavaScript设计模式之代理模式简单实例教程
2018/07/03 Javascript
Mpvue中使用Vant Weapp组件库的方法步骤
2019/05/16 Javascript
详解jQuery中的prop()使用方法
2020/01/05 jQuery
vue-cli4项目开启eslint保存时自动格式问题
2020/07/13 Javascript
vue实现移动端返回顶部
2020/10/12 Javascript
Python中的is和id用法分析
2015/01/26 Python
python打开url并按指定块读取网页内容的方法
2015/04/29 Python
Python获取当前函数名称方法实例分享
2018/01/18 Python
利用Python实现微信找房机器人实例教程
2019/03/10 Python
详解小白之KMP算法及python实现
2019/04/04 Python
Django 自定义分页器的实现代码
2019/11/24 Python
super()与this()的区别
2016/01/17 面试题
数据库方面面试题
2012/04/22 面试题
幼师求职自荐信范文
2014/01/26 职场文书
高中生评语大全
2014/04/25 职场文书
专科应届毕业生求职信
2014/06/04 职场文书
党支部创先争优活动总结
2014/08/28 职场文书
交通事故和解协议书
2015/01/27 职场文书
工程质量保证书
2015/05/09 职场文书
Nginx进程管理和重载原理详解
2021/04/22 Servers
JAVA长虹键法之建造者Builder模式实现
2022/04/10 Java/Android
Django框架之路由用法
2022/06/10 Python