基于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 字典(dict)遍历的四种方法性能测试报告
Jun 25 Python
使用Python脚本将文字转换为图片的实例分享
Aug 29 Python
python开发之for循环操作实例详解
Nov 12 Python
不同版本中Python matplotlib.pyplot.draw()界面绘制异常问题的解决
Sep 24 Python
Python格式化输出%s和%d
May 07 Python
Python基于lxml模块解析html获取页面内所有叶子节点xpath路径功能示例
May 16 Python
利用Python如何批量更新服务器文件
Jul 29 Python
python通过txt文件批量安装依赖包的实现步骤
Aug 13 Python
wxPython实现绘图小例子
Nov 19 Python
python做接口测试的必要性
Nov 20 Python
Python yield生成器和return对比代码实例
Apr 20 Python
python 数据类型强制转换的总结
Jan 25 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下编码转换函数mb_convert_encoding与iconv的使用说明
2009/12/16 PHP
ThinkPHP采用实现三级循环代码实例
2014/07/18 PHP
php中让人头疼的浮点数运算分析
2016/10/10 PHP
PHP编程 SSO详细介绍及简单实例
2017/01/13 PHP
thinkPHP分页功能实例详解
2017/05/05 PHP
PHP 实现base64编码文件上传出现问题详解
2020/09/01 PHP
Aster vs Newbee BO5 第三场2.19
2021/03/10 DOTA
动态调用CSS文件的JS代码
2010/07/29 Javascript
基于jquery的让textarea自适应高度的插件
2010/08/03 Javascript
Eclipse下jQuery文件报错出现错误提示红叉
2014/01/13 Javascript
通过复制Table生成word和excel的javascript代码
2014/01/20 Javascript
bootstrap栅格系统示例代码分享
2017/05/22 Javascript
javascript中mouseenter与mouseover的异同
2017/06/06 Javascript
vue2.0 路由模式mode="history"的作用
2018/10/18 Javascript
vue router的基本使用和配置教程
2018/11/05 Javascript
sharp.js安装过程中遇到的问题总结
2020/04/02 Javascript
JavaScript onclick事件使用方法详解
2020/05/15 Javascript
原生js canvas实现鼠标跟随效果
2020/08/02 Javascript
[02:40]DOTA2英雄基础教程 巨牙海民
2013/12/23 DOTA
轻松掌握python设计模式之访问者模式
2016/11/18 Python
如何使用Python的Requests包实现模拟登陆
2018/04/27 Python
python3+selenium实现126邮箱登陆并发送邮件功能
2019/01/23 Python
python-sys.stdout作为默认函数参数的实现
2020/02/21 Python
解决Python spyder显示不全df列和行的问题
2020/04/20 Python
python+flask编写一个简单的登录接口
2020/11/13 Python
如何通过python检查文件是否被占用
2020/12/18 Python
CSS3毛玻璃效果(blur)有白边问题的解决方法
2016/11/15 HTML / CSS
顶级宝石首饰网络零售商:Angara
2016/10/25 全球购物
文明礼仪标语
2014/06/13 职场文书
公司总经理岗位职责范本
2014/08/15 职场文书
客户答谢会活动方案
2014/08/31 职场文书
学生党员批评与自我批评
2014/10/15 职场文书
2014年餐厅服务员工作总结
2014/11/18 职场文书
爱心捐款倡议书:点燃希望,传递温暖
2019/11/04 职场文书
导游词之宁夏贺兰山岩画
2019/11/08 职场文书
Mysql中调试存储过程最简单的方法
2021/06/30 MySQL