作者介绍:

程虹升,唯品会大数据部数据分析师,数据分析和挖掘实战的践行者,“51CEO”公众号的运营者。

声明:

1. 该文章为技术类文章,部分同学可能对代码部分有所不适,可忽略代码(黑色背景),直接看结论部分即可;

2. 本文得出的结论仅供参考,不要过度联想。


最近双11快来了,睡前空闲时会去看看有啥可以买的东西——某个月黑风高的夜晚,突然get到一个主意,如果可以个性化推送各个电商平台的优惠信息——比如我比较喜欢囤书,当有图书优惠活动的时候,能及时通知到我,那是极好的,不用每天都去京东、当当、amazon看一下。

那么:

第一步,及时获取各个网站每天的优惠信息,可以写个爬虫程序每天去各个网站门口侯着,发现打折、满减等优惠活动;

第二步,把优惠信息整理出来后立刻向我汇报(进行推送);

动手写代码的时候,我改主意了——我想看电商平台的历史优惠活动记录,毕竟每天每个平台的的活动就那么几条(都算不上“大”数据啊)。

找来找去,发现只有京东把【优惠活动】记录挂在官网上,如下图所示,这个就是我要抓取的内容。

注:截图来自 https://www.jd.com/moreSubject.aspx

本文分三部分:

1. 数据抓取,即把数据从网站上倒腾下来;

2. 数据清洗,去除不要的行和列,然后把字段内容清理一下;

3. 探索分析,简要看两个问题:

  • 活动的频率如何?是否有季节变化?

  • 活动名称最高频的关键字是啥?

1. 数据抓取

开始数据抓取前,要顺藤摸“数”——找到数据的源头:

  1. 打开目标网页地址(https://www.jd.com/moreSubject.aspx);

  2. 点击第N页使网页跳转,检查下地址栏是否有变化,如果跳转后的新地址出现 page之类可以表示页面的参数,如果有那么就要对新的地址进行分析,这里是没有的,所以要继续操作;

  3. 快捷键F12查看网页信息(Chrome浏览器),切换到Network菜单下,选择XHR(此时里面是空的),然后重复第2步的操作(点击“第N页”),XHR信息一般就会出现(如下图示)。

单击出现的query信息,查看Header,可以知道3个关键信息:

  • 请求的网址,即Request URL

  • 请求方式,常见的是get 或者 post,这里是post

  • 编码方式,常见的编码方式是'utf-8','gbk','gb2312',这里是 utf-8

再切换到Preview,可以看到json格式的数据。

可以看到数据记录应是在'record'里面(展开小三角形可以看到明细数据)。

关键信息到手了,然后需要分析请求网址中参数的含义。

https://www.jd.com/queryNews.html?type=2&title=&page=650&r=0.03990295037602465

其中:

  • page 应该是页面;

  • type 这个估计就是区分是【公告】还是【活动】;

  • r 不知道是啥,可以去掉后把修改后的地址贴浏览器看一下,看数据返回结果有没有变化(经测试,这个参数是可以不要的)

查清楚网页数据的“来龙去脉”之后就可以写代码了,主要思路如下:

1. 先从网址获取html格式的数据(json)格式;

2. 将json格式的数据转化为dataframe;

3. 把每个页面得到的数据进行合并;

干活之前先加载工具包(本文的分析工具为python,Windows7环境)

1. 定义一个函数,该函数实现的功能是将url网址转化为html格式数据

2. 循环迭代网页id,批量抓取数据,并进行整合

2. 数据清洗

数据采集完毕后,需要查看下数据情况:

  • 数量,使用 df_res.shape 命令来查询函数和列数;

  • 质量,使用 df_res.head() 来看下看5行数据;

这里发现有三个问题:

  1. 有三列变量的值貌似都是None,需要删除掉;

  2. 两个变量是日期时间格式,需要改成日期(yyyy-mm-dd)格式;

  3. title列有一些html标签(<font>括住的内容),需要清理掉;

第1步,用 df_res.describe() 命令看下变量描述情况,发现commentvisible, content, share 这三列变量都是None值。

删除列可以使用如下两种方式:

  • df_res = df_res.drop(['commentvisible','content','share'],axis = 1)

  • del df_res['commentvisible']

第2步,把日期时间格式改为 yyyy-mm-dd 日期格式

第3步,去除title列的html标签

因为前面的英文标签和中文标题可以用分隔符“>”来分割,而且一般来说中文标题里面一般不会出现>符号,所以,直接对字符串分割,得到list,然后截取list最后一个值(中文标题在最后)。

经过3步的清洗,得到数据应该是如下样式了

注意到前面的变量描述结果,unique小于count则说明数据存在重复,这里考虑【活动上线日期time,活动名称title】是不重复的就行,后面的统计分析也主要是基于这两列。

3. 探索分析

探索分析主要看两个问题:

  • 每年、季度的活动频率如何?

  • 活动中最高频的关键字是啥?

先计算日期衍生的变量——活动的年、季、月。

得到的数据格式如下

按年对活动计数,看活动频率

结果如下

说明:

1. 活动数量在2010年后数量较多,后续的分析也主要考虑2010年后;

2. 13年14年是活动高峰期,这个可能和京东上市有关(京东于2014年5月上市)。

分析季度活动波动情况

这里定义一个分组柱状图的作图函数groupbar (https://github.com/hscheng/python)。

作图结果如下(并没有发现什么季节规律啊)

接下来看活动标题中出现的最高频的关键词,思路如下:

  1. 先用jieba来分词;

  2. 剔除分词结果中不需要的标点符号等;

  3. 统计每个关键词的频率;

  4. 使用wordcloud包来做词云图;

1.分词

2.清洗

3.计数

4.作图

接下来就是见证奇迹的时刻了!

可以得到两点结论:

  1. 满减、折扣是优惠活动的主要形式,实实在在的优惠更能打动消费者啊;

  2. 空调、手机、电视是出现频率最高的品类,这三个品类不仅居家必备,而且单价都比较高。

以上是网络爬虫的简要分享,欢迎留言讨论。

附:

本文完整代码笔记(html版)见 https://github.com/hscheng/python

网络爬虫-京东优惠活动数据分析相关推荐

  1. 网络爬虫 | 京东全站数据采集(类目、店铺、商品、评论)——基于Python中Scrapy框架

    目录 1.定义采集数据的存储结构 2.定义管道文件 3.定义中间件文件 4.scrapy爬虫设置文件修改 5.商品类目抓取 6.商品信息抓取 7.店铺信息抓取 8.评论信息抓取 9.抓取过程 10.基 ...

  2. 基于网络爬虫的大学生就业数据分析与预测模型研究

  3. python网络爬虫的第三方库_Python常用第三方库_网络爬虫、数据分析与WEB开发、机器学习...

    Python语言有超过12万个第三方库,覆盖信息技术几乎所有领域.下面简单介绍下网络爬虫.自动化.数据分析与可视化.WEB开发.机器学习和其他常用的一些第三方库,如果有你感兴趣的库,不妨去试试它的功能 ...

  4. Python 网络爬虫:Selenium 好买基金网

    更多商业数据分析案例(原理,完整代码,数据集).统计学.SQL.网络爬虫详见公众号 " 数据分析与商业实践 " 引言   网络爬虫应用十分广泛,本篇针对金融领域,目的为根据用户输入 ...

  5. 网络爬虫笔记4,信息提取之Re库

    每页44个商品 通过对例子的分析,我们得到了搜索接口和翻页的URL对应属性 / import requests import redef getHTMLText(url):try:r = reques ...

  6. 网络爬虫,python和数据分析学习--part1

    # -- coding: utf-8 -- """ Created on Tue Oct 10 08:38:20 2017 本段程序为科大王澎老师<网络爬虫,pyt ...

  7. 网络爬虫,python和数据分析学习--part2

    Created on Tue Oct 10 10:47:31 2017 本段程序为科大王澎老师<网络爬虫,python和数据分析>中P15,针对spyder3做了微调 主要任务:实现了自动 ...

  8. python网络爬虫第三方库_Python常用第三方库大盘点

    Python语言有超过12万个第三方库,覆盖信息技术几乎所有领域.下面简单介绍下网络爬虫.自动化.数据分析与可视化.WEB开发.机器学习和其他常用的一些第三方库,如果有你感兴趣的库,不妨去试试它的功能 ...

  9. 《Python3网络爬虫开发实战》第二波抽奖赠书活动来了!

    嗨~ 给大家重磅推荐一本书!上市两月就已经重印 4 次的 Python 爬虫书!它就是由静觅博客博主崔庆才所作的<Python3网络爬虫开发实战>!!!同时文末还有抽奖赠书活动,不容错过! ...

最新文章

  1. 各大浏览器 CSS3 和 HTML5 兼容速查表
  2. linux运维常用命令一句话(持续更新中)
  3. Satwe楼板能用弹性模计算吗_现浇楼板淋水后却出现裂缝,还好老师傅有经验,多是这3点造成的...
  4. Adobe illustrator 批量变换同时选中的单个对象 - 连载 12
  5. jqgrid如何渲染表格数据_Jqgrid入门-操作表格的数据(二)
  6. linux下mysql5.7创建用户_Linux下mysql5.7 创建、删除用户与授权
  7. Java异步编程——深入源码分析FutureTask
  8. Log4J漏洞补丁(ArcGIS Enterprise适用)
  9. LeetCode——868. 二进制间距
  10. 动手学深度学习之锚框
  11. 【Java】设计一个动物声音“模拟器”,希望模拟器可以模拟许多动物的叫声。
  12. Material Design控件使用(一)
  13. 由kobject_create_and_add全面了解kobject
  14. C#快速随机按行读取大型文本文件 - 磊的博客 - sanshi_leilei - 和讯博客
  15. 互联网通信基础与Ajax篇
  16. ubuntu配置jre8
  17. 420个生活小窍门小常识
  18. 安全软件秘诀——根据ISO / DIS 26262开发ECU基础软件
  19. 基于MSP430G2231实现多路数据采集器
  20. 关于心理学方面的一点看法

热门文章

  1. Flask + vue 前后端分离的 二手书App
  2. 计算机画画教程,【推荐】初学者电脑画画教程
  3. vuetify学习第6天之v-btn-toggle---按钮组
  4. cheng@ARM结构与编程之day3-MOV LSL
  5. 徒步运动软件怎么申请测试,专业人士教你如何顺利完赛50公里徒步
  6. 苹果系统 如何快速访问服务器,mac下的finder怎么使用技巧 苹果系统如何快速打开Finder...
  7. CC2530串口命令控制LED灯开关
  8. CuraEngine
  9. Voldemort — 分布式 key-value 存储系统
  10. cuda中pinned memory(page-locked memory)