网络爬虫-京东优惠活动数据分析

浏览: 2614

作者介绍:

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

声明:

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

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


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

那么:

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

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

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

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

image.png

注:截图来自 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信息一般就会出现(如下图示)。

image.png

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

  • 请求的网址,即Request URL

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

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

image.png

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

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

image.png

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

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环境)

image.png

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

image.png

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

image.png

2. 数据清洗

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

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

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

image.png

这里发现有三个问题:

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

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

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

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

image.png

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

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

  • del df_res['commentvisible']

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

image.png

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

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

image.png

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

image.png

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

image.png

3. 探索分析

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

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

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

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

image.png

得到的数据格式如下

image.png

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

image.png

结果如下

image.png

说明:

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

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

分析季度活动波动情况

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

image.png

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

image.png

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

  1. 先用jieba来分词;

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

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

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

1.分词

image.png

2.清洗

image.png

3.计数

image.png

4.作图

image.png

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

image.png

可以得到两点结论:

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

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

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

附:

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

推荐 0
本文由 每天进步一点点2015 创作,采用 知识共享署名-相同方式共享 3.0 中国大陆许可协议 进行许可。
转载、引用前需联系作者,并署名作者且注明文章出处。
本站文章版权归原作者及原出处所有 。内容为作者个人观点, 并不代表本站赞同其观点和对其真实性负责。本站是一个个人学习交流的平台,并不用于任何商业目的,如果有任何问题,请及时联系我们,我们将根据著作权人的要求,立即更正或者删除有关内容。本站拥有对此声明的最终解释权。

0 个评论

要回复文章请先登录注册