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

作者介绍:

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


声明:

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

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



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

那么:

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

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

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

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

640?wx_fmt=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信息一般就会出现(如下图示)。

640?wx_fmt=png

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

  • 请求的网址,即Request URL

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

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

640?wx_fmt=png

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

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

640?wx_fmt=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环境)

640?wx_fmt=png


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

640?wx_fmt=png

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

640?wx_fmt=png


2. 数据清洗

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

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

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

640?wx_fmt=png

这里发现有三个问题:

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

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

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


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

640?wx_fmt=png

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

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

  • del df_res['commentvisible']

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

640?wx_fmt=png

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

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

640?wx_fmt=png

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

640?wx_fmt=png

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

640?wx_fmt=png


3. 探索分析

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

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

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

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

640?wx_fmt=png

得到的数据格式如下

640?wx_fmt=png

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

640?wx_fmt=png

结果如下

640?wx_fmt=png

说明:

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

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


分析季度活动波动情况

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

640?wx_fmt=png

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

640?wx_fmt=png

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

  1. 先用jieba来分词;

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

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

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

1.分词

640?wx_fmt=png

2.清洗

640?wx_fmt=png

3.计数

640?wx_fmt=png

4.作图

640?wx_fmt=png


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

640?wx_fmt=png

可以得到两点结论:

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

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


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


附:

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


  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值