最近一段时间一直在学习 Python 爬虫、数据分析和数据可视化,想通过一个项目对这些知识做一下整体的运用和总结,所以参考了网络上文章上几篇文章的思路通过数据抓取、数据清洗、数据分析、数据可视化一整个数据分析的流程简单地完成了这篇分析文。
为什么选择虎嗅网进行分析呢?
主要是因为虎嗅网创办于2012年5月,根据下面的分析我们可以知道网站发布第一篇文章的时间是在2012年4月3号。它是一个聚合优质创新信息与人群的新媒体平台,这个平台专注于贡献原创、深度、犀利优质的商业资讯、围绕创新创业的观点剖析与交流。经过这几年的发展,个人认为虎嗅上面还是积累了不少的好文章,所以这次打算去一探究竟。
1、数据抓取
通过 Python 的 pyspider 框架对虎嗅网进行抓取,pyspider 是一个可视化界面,可以看到爬虫运行的整个过程和具体进度。
pyspider web界面
爬虫最终的数据是保存在数据库 MongoDB 中,也可以再把数据输出为 csv 格式。
部分数据截图
image
可以看到这里抓取了虎嗅网的主页文章,文章抓取时间为 2012 年开始至 2019 年 6 月 22 日,共计有 5 万多篇文章。抓取了 7 个字段信息:摘要、评论数、收藏数、作者名、文章标题、文章链接和发文时间。
2、数据清洗
获取数据之后首先看一下数据的总体情况,一般要对数据进行整理,删除不需要的字段,增加一些我们分析需要的字段。
data.shape #查看行数和列数
data.info() #查看总体情况
data.head() #输出前5行
#结果:
(53690, 8)
Data columns (total 8 columns):
_id 53690 non-null object
abstract 53690 non-null object
comment 53690 non-null int64
favorites 53690 non-null int64
name 53690 non-null object
title 53690 non-null object
url 53690 non-null object
write_time 53690 non-null object
dtypes: int64(2), object(6)
0 ObjectId(5d0efdd2b958a70fb81f6635) 你看到的结果,很可能是“假结果” 6 133 人神共奋 为什么“总结经验”反而把你带进沟里? https://www.huxiu.com/article/304652.html 4天前
1 ObjectId(5d0efdd2b958a70fb81f6636) 守住财富,要付出10倍于创造财富所需的才智 8 162 孤独大脑 一生只用富一次 https://www.huxiu.com/article/304649.html 4天前
2 ObjectId(5d0efdd2b958a70fb81f6637) 即使B站审核组为平台付出了太多,但在用户眼中依旧是恶人 20 28 动漫经济学 B站番剧自查的第19天 https://www.huxiu.com/article/304648.html 4天前
3 ObjectId(5d0efdd2b958a70fb81f6638) 真正的货币战争才刚刚开始 5 28 量子学派? Facebook的“野心”? https://www.huxiu.com/article/304642.html 4天前
4 ObjectId(5d0efdd2b958a70fb81f6639) 原创 社区团购未来会呈现出四种发展趋势,行业进入洗牌期。 12 101 吴倩男 社区团购周年考:唯一能赚钱的生鲜电商模式? https://www.huxiu.com/article/304641.html 4天前
可以看到数据是 53690 行 × 8 列,其中有一列没有用的 _id 需要删除,因为 write_time 列的数据格式是 object,需要把它变为日期格式,为了方便分析,把发布时间为几个小时前或者几天前的文章全部改为爬取数据的当前 2019 年 6 月 22 日。
#删除无用_id列
data.drop(['_id'],axis=1,inplace=True)
# 更该日期格式
data['write_time'] = data['write_time'].replace('.*前','2019-06-22',regex=True)
data['write_time'] = pd.to_datetime(data['write_time'])
下一步是需要查看数据有没有重复值,如果存在重复值的话,需要把重复的行删除。
# 判断整行是否有重复值
print(any(data.duplicated()))
# 显示True,表明有重复值,进一步提取出重复值数量
data_duplicated = data.duplicated().value_counts()
# 结果显示有 720 重复值
print(data_duplicated)
#结果:
True
False 52970
True 720
# 删除重复值
data = data.drop_duplicates(keep='first')
# 删除部分行后,index中断,需重新设置index
data = data.reset_index(drop=True)
接下来为了之后分析的需要,我们增加两列字段,一列是文章标题长度列,一列是年份列。
data['title_length'] = data['title'].apply(len)
data['year'] = data['write_time'].dt.year
然后再看一下处理后的数据的整体情况,基本完成了整个数据清理的过程。
Data columns (total 9 columns):
abstract 52970 non-null object
comment 52970 non-null int64
favorites 52970 non-null int64
name 52970 non-null object
title 52970 non-null object
url 52970 non-null object
write_time 52970 non-null datetime64[ns]
title_length 52970 non-null int64
year 52970 non-null int64
dtypes: datetime64[ns](1), int64(4), object(4)
3、数据分析
首先对数值型数据进行描述型数据分析:
print(data.describe())
comment favorites title_length year
count 52970.000000 52970.000000 52970.000000 52970.000000
mean 10.681688 40.491240 22.431320 2015.970530
std 22.544517 55.153885 9.526061 1.961912
min 0.000000 0.000000 1.000000 2012.000000
25% 3.000000 11.000000 16.000000 2014.000000
50% 6.000000 23.000000 22.000000 2016.000000
75% 12.000000 48.000000 27.000000 2018.000000
max 2376.000000 1269.000000 224.000000 2019.000000
可以得出以下几个结论:
-
虎嗅网大部分文章的评论数和收藏数都是比较低的,平均的评论数在 10 个左右,收藏数在 40 个左右,说明虎嗅网的文章的活跃度都不够高。
-
文章的标题字数长度平均在 22 个 左右,最短的标题字数是 1 个,最长的标题长度是 224 个,极差还是比较大的,我认为一般文章的标题字数还是适中为好。
-
有一部分文章的评论数和收藏数还是特别高的,说明虎嗅网上面还是存在不少爆文,下面会列举出来。
接下来对两个非数值型变量(name、write_time)进行描述型统计:
print(data['name'].describe())
print(data['write_time'].describe())
count 52970
unique 5272
top 虎嗅
freq 8457
Name: name, dtype: object
count 52970
unique 2388
top 2018-10-31 00:00:00
freq 286
first 2012-12-02 00:00:00
last 2019-06-16 00:00:00
Name: write_time, dtype: object
通过对这两个非数值型数据进行分析,我们可以发现:
-
从 2012 年到 2019 年,总共有 5272 位作者在虎嗅网上发布了 52970 篇文章,其中发布文章最多的作者是虎嗅官方,总共发表了 8457 篇文章。
-
从时间上看,发布文章的天数总共有 2388 天,最早发布文章是在 2012 年 12 月 2 号,最后发布文章是时间是爬虫抓到文章的最后一天,也就是 2019 年 6 月 16 号,当然这个网站还在正常运转中,其中在 2018 年 10 月 31 号这天发布的文章数最多,是 286 篇文章。
4、数据可视化
-
从 2012 年到 2019 年,以季度为单位,每个季度的发文数量如下:排除掉 2012 年第 4 季度数据记录不全外,看其他各个季度的文章发布数,基本都稳定在 1500 篇以上,而且总整体的趋势上看,有逐年上升的趋势,在 2018 年以后每一个季度的发文数都在 2000 篇以上。
image -
文章收藏量 Top 10
序号 | title | favorites | comment |
---|---|---|---|
1 | 大江大河40年:改变命运的七次机遇 | 1269 | 59 |
2 | 两万字,任正非采访全记录 | 1240 | 80 |
3 | 读完这10本书,你就能站在智商鄙视链的顶端了 | 1123 | 14 |
4 | 寒冬、裁员、失业……职场人如何找到出路? | 1110 | 41 |
5 | 张小龙4个小时演讲全文:每天有1亿人教我做产品 | 1035 | 43 |
6 | 藏在县城的万亿生意 | 927 | 39 |
7 | 京东打脸央视:你所谓的翻新iPhone均为正品,我们保留向警方报案的权利 | 867 | 10 |
8 | 货币如水,覆水难收 | 865 | 43 |
9 | 离职创业?先读完这22本书再说 | 862 | 9 |
10 | 日本消费社会演变史——窥见未来 20 年的中国 | 844 | 22 |
收藏量前五有几篇是近期的,还有一篇是 2015 年推荐书的文章,这里放上这几篇文章的链接:
- 选取每年文章的收藏量前三的文章进行分析
year | title | favorites |
---|---|---|
2012 | 经营微博的十个经典案例 | 102 |
《大数据时代》,一场生活、工作与思维的大变革 | 93 | |
周鸿祎:如何求生于这个只属于巨头的江湖 | 79 | |
2013 | 创业者手记:我所犯的那些入门错误 | 475 |
马化腾三小时讲话实录:千亿美金这个线,其实很恐怖 | 392 | |
雕爷亲身谈:白手起家的我如何在30岁之前赚到1000万。读《MBA教不了的创富课》 | 355 | |
2014 | 85后,突变的一代 | 532 |
雕爷自述:什么是我做餐饮时琢磨、而大部分“外人”无法涉猎的思考? | 524 | |
据说这 40 张PPT是蚂蚁金服的内部培训资料…… | 486 | |
2015 | 读完这10本书,你就能站在智商鄙视链的顶端了 | 1123 |
京东打脸央视:你所谓的翻新iPhone均为正品,我们保留向警方报案的权利 | 867 | |
离职创业?先读完这22本书再说 | 862 | |
2016 | 蝗虫般的刷客大军:手握千万手机号,分秒间薅干一家平台 | 557 |
准CEO必读的这20本书,你读过几本? | 550 | |
运营简史:一文读懂互联网运营的20年发展与演变 | 511 | |
2017 | 2016年已经起飞的5只黑天鹅,都在罗振宇这份跨年演讲全文里 | 777 |
真正强大的商业分析能力是怎样炼成的? | 755 | |
王健林的滑铁卢 | 719 | |
2018 | 寒冬、裁员、失业……职场人如何找到出路? | 1110 |
藏在县城的万亿生意 | 927 | |
货币如水,覆水难收 | 865 | |
2019 | 大江大河40年:改变命运的七次机遇 | 1269 |
两万字,任正非采访全记录 | 1240 | |
张小龙4个小时演讲全文:每天有1亿人教我做产品 | 1035 |
-
发文数最高的作者 Top 20 (除去虎嗅网官方)
image -
描述文章收藏数与评论数关系的散点图
image
从中可以看出,大部分文章都是评论数低、收藏数也低,也存在某些异常值,也就是说一些文章存在评论数很高而收藏数很低或者是收藏数很高而评论数很低的异常情况。
-
文章标题的长度与文章收藏量的关系
image
好像规律不是特别明显,但是可以发现文章收藏数高的标题都不是很长,而文章标题比较长的收藏数都很低。
-
词云图
通过对这 5 万多篇文章的标题和摘要进行分词处理,然后利用 Python 中的 WordCloud 包生成词云图,这样就可以直观地看出虎嗅网的文章关注的话题比重高低。
image
可以看到虎嗅网文章所关注的话题都集中在国内互联网领域,比如提及的公司有阿里、腾讯、小米、谷歌、苹果、京东等,这些都是著名的互联网公司,提及的关于产品、技术、用户、市场、营销、品牌、电商等也都是互联网相关的话题。
这篇文章用到的关于数据处理和可视化的技术主要有:
- 数据处理:numpy、pandas
- 可视化:matplotlib、seaborn
- 分词:jieba
- 词云图:wordcloud
网友评论