微博热门话题“19天”,是一个微博连载漫画的话题。目前该话题阅读量60多亿,讨论800多万,粉丝20多万。笔者使用Python、Gephi等工具,对其近一个月的粉丝信息和带话题微博的用户(讨论用户)信息进行了分析。
一、数据爬取
基本思路:为了获取粉丝和讨论用户的社交网络,首先考虑的自然是要获得他们之间的关注关系。一个用户的关注数不会太多,基本维持在两三百,用户的粉丝列表则随着用户知名度的不同有着很大的差别,有的用户甚至有好几十万粉丝,所以爬取每个用户的关注列表是比较实际且有效率的选择。操作中,先爬取5000个关注话题的粉丝以及1000条最新微博的用户的ID和基本信息,再根据获得的ID列表爬取到这些用户的关注列表。
首先在浏览器中查看点击所要获取网页,观察给网站发送的http请求,在代码中模拟浏览器访问,在Header中添加URL,Cookie和User-Agent。
Cookie保持登录:用户在网页登录之后,会保存Cookie来实现之后的自动登录,可以利用这个Cookie让爬虫保持一段时间的登录,获得返回界面。
微博数据XHR包:在浏览器爬取的过程中,笔者发现,所要爬取的数据都存在XHR包中,并且可以在Preview中看到数据结构,根据结构可以获得想要的数据,例如用户的ID和性别等。观察发现,这些网页的URL只有最后的页数不同,所以根据URL里页数的迭代,可以获取每一页的XHR包。
User-Agent切换:为了防止连续爬取过多数据,采用循环使用不同User-Agent的方式,模拟不同的浏览器轮流请求网页,防止访问过于频繁。
代理IP设置:同样,为了防止因访问过于频繁而被禁止访问,并尽可能地一次多爬取一些数据,在网络上获得一些可用的代理IP,用这些IP循环访问。
Cookie切换:由于同一用户访问微博太多次也可能被暂时封号,所以可以使用几个不同的用户Cookie来访问。
数据保存:由于数据量很大,爬取速度比较慢,所以需要在程序中断之后,能够在中断位置继续爬取,而不用再次重新爬取。这样的设定是很有必要的。笔者采用的方法是每爬取一个用户的关注列表就写入文件中,这样当程序中断或网络不稳定时,可以打开文件定位到爬取的位置,下一次可以从还未被爬取的用户开始爬取。
二、数据分析
接下来,根据获得的关注列表,统计出这些用户之间的关注关系,即边。将边导入Gephi中,做网络可视化的分析。
1.话题粉丝的情况分析
笔者对获得的4963个粉丝进行了分析。
性别分布:男生1082人,女生3881人,可以看出在这个漫画的话题中,女粉丝居多。这也与常理相符,一般喜欢这种轻松内容小漫画的也都是女生居多。
地域分布:可以看出,关注人数在各个省市的分布较为均匀。广东等一些经济较为发达的地区人数稍多,这些地区的居民接受新事物的能力较高。
社交网络:经过分析发现,该网络有4963个节点,64条边,4906个孤岛,其中有4882个是单独节点。这个网络的平均度为0.026,非常稀疏,由此可看出这4963个用户之间的关系很分散。
2.讨论用户的情况分析
笔者爬取了最新1000条带话题的微博,发现这些微博是由580个用户发表的,每个用户发表了不止一条话题微博。
性别分布:男生141,女生439,可以看出讨论用户中也是女生居多。
社交网络:经过分析发现,这580个用户的社交网络中有580个节点,1471条边,108个孤岛,其中一个大的孤岛内有472个节点,一个小孤岛有2个节点,剩下106个都是单独节点。
这个网络的平均度为5.702,大多数点的出入度都在较小的数量级,只有一个点的出入度较大。这个点的入度为339,说明580人中有399个用户都关注了他。经查看这个点的ID,发现这个用户是该话题的主持人,也是该漫画的作者。网络中有两个点之间有两条边,说明这两个用户互相关注。
话题微博数量随时间的变化:笔者爬取了1000条实时微博,统计了它们发布的时间,可以看到这个话题下微博发布数量随时间的变化趋势。基本上每天发布微博的数量都在几十条,没有大的衰减或上升的趋势,说明讨论话题的热度一直比较稳定。
最终,从爬取的5000个粉丝的关注列表中得到的社交网络显示,这些用户中,只有600个左右的讨论用户之间有着较为紧密的联系,其他的基本没有联系。