*本文原创作者:追影人
前言
前不久突然看到这篇文章FreeBuf文库功能上线:文海求知,有“库”相伴,才发现freebuf已经走过了6年!我们00后对于这些好陌生啊……哈哈哈
当你有一个无聊的想法时,就大胆的去实现它。本文利用web爬虫对Freebuf部分页面进行内容抓取,将相关数据进行分类入库,并进行一些可视化呈现。需要说明的是,由于水平有限,爬虫在爬取过程中可能会出现数据爬取不全的现象,所以一些数据都以Freebuf官方数据为准,本文内容纯属娱乐。
先导篇
freebuf经历了6年,不少新同学可能对这个漫长历史有些陌生,我们一起来温习一下。(可选择性跳过)
Freebuf在成长,文章和用户也不断增加,那么我们有必要用数据来扒一扒freebuf里面有哪些有趣的东西。
数据篇
经过web爬虫的辛勤工作,共爬取7103篇文章、8645用户主页、101056条评论,绘制了如下图表。
备注:可以爬取的最早发表的文章为这一篇:SEO打手攻防小揭密,该文发表于2012-04-27。
Freebuf先后于2013-11和2014-12出台金币奖励计划和现金奖励计划。
(详见:[重磅]FreeBuf优质文章奖励计划,鼓励原创:FreeBuf原创文章现金奖励计划)
上图可以看出奖励计划激励了很多原创作品的诞生。
根据文章所标定的标签进行分类统计。
阅读数排名前十的文章。
评论数排名前十的文章,可以看到活动类文章互动积极性非常高,稳居前4。
下图为新注册用户增长图。说明:本爬虫所统计的用户数量只占freebuf用户的很小一部分,原因会在后面进行解答。
注册用户中很多都使用默认的头像,即下面这样子。
在统计的8645个注册用户中,该类用户共6855个,占比79.29%。
没有添加个人描述信息的用户(即个人描述内容为”个人描述:这家伙太懒了,还未填写个人描述!“)有7527个,占比87.07%。
注册用户的等级分布百分比图,大家有兴趣可以找找那个大boss,然后去膜拜。
对用户金币数量、银币数量和漏洞盒子Rank进行排名,绘制出TOP10。
金币数量排名第一的应该是小编吧。。。。相比金币数量,银币数量的TOP10显得就和谐多了。
漏洞盒子的TOP10一定都是些大牛。
发布文章数量最多的10个用户。
使用匿名身份发布的文章数量654篇,占总文章数的9.21%。
发布评论最多的10个注册用户。
使用匿名、微博、注册账号进行评论的用户百分比图。
使用匿名身份进行评论时,最受欢迎的10个昵称。
用户评论活跃时段,高峰出现在9至11点,凌晨评论的肯定是加班狗。
最受欢迎的10条评论(第一条评论内容是图片,未能贴出,可自行检索)。
2016年度评论热词TOP100
2014-2016各年度文章标题关键词,可以看出各个年度的关注点在发生变化。
2014年
2015年
2016年
由于文章、用户、评论数总量较大,全部数据绘制成force力导向图会使得图片过密而无法加载。所以现选取2016年6月份发布的文章及评论制作force图。
图标备注淡蓝色星:原创文章蓝色星:普通文章黄色星:金币奖励文章黄色眼镜:注册用户绿色眼镜:匿名用户淡绿色眼镜 :weibo用户连线:评论关系
下图为部分细节图
分享篇
看完了眼花撩换的数据和图片,下面我们看看背后用了哪些技术和工具。
关于web爬虫
1、利用浏览器开发人员工具对html页面进行标签的定位。
2.、利用python的urllib库进行页面的请求、beautifulsoup4库进行html标签元素的提取。
笔者本打算对文章字数进行统计,但是发现freebuf文章中夹杂有许多<noscript>标签,如下图。
noscript标签是为了在不支持script的浏览器上使用,浏览器会自动识别,而bs4不能够正确识别。因此<noscript>标签会产生坏标签干扰bs4的正常工作,而不能够完整取出contenttxt标签的完整内容。因此在处理文章内容时,需要对html页面进行预处理,去掉<noscript>标签包含的内容。
关于数据存储
本文使用MySQL数据库进行数据的存储,使用python的mysqldb库进行相关增删改查操作。
关于数据来源
经过对html页面元素的分析,发现如下几个入口可用爬取相关数据。
文章:
http://freebuf/page/*用户主页:
http://freebuf/author/*文章评论:文章html页面中commnet_panel.find(name=”a”, attrs={‘class’: ‘next page-numbers’})获取下一页评论
细心的读者会发现文章下面的评论区每条评论只有日期并没有具体时刻,那笔者是如何完成上面的评论发表时刻图的呢?
在用户主页的“他的点评”区
http://freebuf/author/用户名?comment=1,即可找到对应评论的具体时刻,这样就能对之前爬取的评论时间进行具体化。
关于数据分类
文章分为普通文章、金币奖励的优质文章、现金奖励的原创文章。
发表文章的用户分为匿名发表用户和注册用户,其中匿名用户指使用马甲发表文章的用户,比如
http://freebuf/author/匿名用户
http://freebuf/author/0000000
进入0000000用户的文章后发现每一篇文章都是其他名字,且名字无链接。
笔者在爬取时,天真的认为每个用户的主页地址都是
http://freebuf/author/ 用户名,每个文章上面的作者名都带个人主页链接。后来爬虫跑起来就发现问题有些不对了,然后发现了这些马甲号。同时还发现一些用户的主页地址和名称没有任何链接,看起来是随机编码产生(虽然都是爬虫爬取的公开数据,这里还是打码吧)。
评论用户分为匿名用户、注册用户和weibo用户,因为匿名用户属于开放性用户,同一昵称并不能代表同一个人,所以上面的很多统计只针对注册用户进行。
关于数据缺失
1.程序的缺陷导致信息爬取不全
2.这里所统计的用户只包含发表过文章或评论的用户,因为只有这样才会在页面上留下个人主页链接,供爬虫爬取。而那些注册后从未发表过任何文章或评论的用户(俗称“僵尸用户”),因不能够被爬虫爬取,所以不在统计之列。
另外,freebuf用户有很大一部分并没有任何账号,而只是进行文章的阅读浏览,所以这部分用户也无法知晓。(这个数据只有freebuf官方知道了。。。)
关于数据可视化
文中的图表使用highcharts、D3.js进行绘制。
关于这些可视化工具还有很多,比如C3、Echarts、chart.js、xchart等。使用这些工具只需要下载相关js库和自己喜欢的模板即可,同时需要搭建web服务器。直接用浏览器打开html页面时,一些数据文件可能会因为权限问题无法被加载,因此需要借助web服务器来完成。
一些同学从来没有接触过js,但是这一类可视化工具进行简单的使用门槛挺低的,打开例子中的html页面,查看相关<script>标签,看看这些标签的路径是否正确,一定要注意名称要与对应的js脚本相同。
D3.js实例传送门
http://christopheviau/d3list/
写在最后
本文利用python爬虫对freebuf页面数据进行爬取、整理、分析和呈现,涉及到爬虫编写、数据库操作、数据分析、数据可视化等多个领域,虽然都很浅显,但是在这个数据膨胀的时代,数据的价值也越发重要,从中挖掘出有价值的信息将会带来强大的发展动力。最后,还是祝愿freebuf越来越好。
温馨提示:文中数据均来源于公开信息,如果给您带来不便,请私信我,我会给您进行打码处理。
*本文原创作者:追影人,转载须注明来自FreeBuf黑客与极客(FreeBuf.COM)