11

通过Python分析2020年全年微博热搜数据

 3 years ago
source link: https://blog.yuanpei.me/posts/2758545080/
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

通过Python分析2020年全年微博热搜数据

2021-01-2431 28 min.

几天前, Catcher Wong 大佬告诉我,他终于写完了2020年的年终总结。在看完大佬的年终总结以后,我有一种“前浪被后浪拍死在沙滩上”的感觉,正如当学生时都看“别人家的孩子”,工作以后看的都是“别人的年终总结”。我们的生活,其实就是由“别人”和“我们”交织在一起,而更多的时候,是成为“大多数”的“我们”,去关注成为“少数”的“别人”。我想说的是,世间万物互为装饰,就像卞之琳在《断章》里写道,“明月装饰了你的窗子,你装饰了别人的梦”。即便一个人在历史长河中,尤如一叶飘泊不定的孤舟在波涛中摇荡,可每一朵浪花都曾以自己的方式美丽过,所以,看“别人”的生活,联想“我们”的生活,这便是我同2020告别的一种方式,为此,博主决定抓取2020年全年366天的微博热搜,通过可视化的方式来串联起2020年的回忆。

首先,我们来考虑微博热搜的数据来源。 微博 官方提供了一个热搜排行榜的页面:https://s.weibo.com/top/summary,可惜这个网站只支持查看当天的热搜,显然这无法满足我们的需求。在搜索引擎的帮助下,找到了两个网站,它们分别是:微博时光机热搜神器。经过一番权衡,决定选择页面结构更简单一点的 微博时光机

通过抓包,可以快速获得两个关键的接口,它们分别是 获取timeId接口获取历史热搜接口

Firefox抓包示意图
Firefox抓包示意图

简单来说,我们指定一个日期,第一个接口会返回timeId。接下来,通过这个timeId调用第二个接口就可以获得热搜数据。仔细观察的话,第一个接口传递的data参数像是一个BASE64加密后的结果,尝试解密后发现我的猜想是对的,加密前的内容如下:

["getclosesttime",["2021-01-20T23:08:02"]]

这意味着我们只需要改变这里的日期就可以啦,因此,我们的思路无非就是从2020年1月1日开始,依次请求热搜接口获取数据,直到2020年12月31日。这里想顺便吐槽下这个网站的接口设计,居然清一色地全部用数组来返回结果,难道是为了省掉这几个字段来节省流量吗?

接口返回值说明-1
接口返回值说明-1
接口返回值说明-2
接口返回值说明-2

吐槽归吐槽,这里我们可以非常容易地写出对应的代码,由于日期和timeId的对应关系是固定的,为了减少后续的请求数量,我们使用MongoDB来对数据进行持久化。同样地,抓取热搜采用了类似的方式,因为历史热搜同样是确定的数据,这里只给出关键的代码,并不代表你可以无脑地复制、粘贴

# 获取指定日期对应的timeId
def get_timeId(date, cookie):
cacheKey = date.strftime('%Y-%m-%d')
records = list(store.find(TABLE_TIME_ID, {'date': cacheKey}))
if len(records) > 0:
return records[0]['timeId']
else:
data = "[\"getclosesttime\",[\"{d}\"]]".format(d=cacheKey)
data = base64.b64encode(data.encode('utf-8'))
url = 'https://www.weibotop.cn/apis/androidrouter/?versioncode=1&=&data=' + str(data, 'utf-8')
data = request(url, cookie)
timeId = json.loads(data)[0]
store.insert(TABLE_TIME_ID, [{'date': cacheKey, 'timeId': timeId }])
return timeId

# 获取指定timeId对应的热搜
def get_weibo_trending(timeId, cookie):
records = list(store.find(TABLE_TRENDING, {'timeId': timeId}))
if len(records) > 0:
return records
else:
url = 'https://www.eecso.com/test/weibo/apis/currentitems.php?timeid=' + timeId
data = request(url, cookie)
data = json.loads(data)
trendings = list(map(lambda x:{'title':x[0], 'createdDate':x[1], 'updatedDate':x[2], 'rank':int(x[3])}, data))
for trending in trendings:
trending['timeId'] = timeId
trending['href'] = 'https://s.weibo.com/weibo?q=' + trending['title']
trending['createdDate'] = datetime.datetime.strptime(trending['createdDate'], '%Y-%m-%d %H:%M:%S')
trending['updatedDate'] = datetime.datetime.strptime(trending['updatedDate'], '%Y-%m-%d %H:%M:%S')
store.insert(TABLE_TRENDING, trendings)
return trendings

至此,我们就完成了微博热搜数据的抓取工作!

好了,在采集到这些热搜数据以后,我们就可以着手准备热搜数据的分析工作啦!其实,目前这份热搜数据挺简陋的,它只有热搜话题、上榜时间、更新时间以及话题热度这样四个关键字段。而作为辅助,我们增加了热搜话题的链接,如果后续需要更详尽的信息,可能需要从这里来寻找突破口。在今天这篇博客里,我们主要从下面四个维度来分析和挖掘2020年全年的微博热搜:

全年热搜热度分析

首先,我们要分析的是全年热搜的热度。何谓热度呢?我个人认为,可以从话题的使用频率和话题的持续时间两个方面来考虑,即,一个话题转发或者参与的人越多,话题持续的时间越长,则认为该话题越“热”。例如罗翔老师说2020年进入了“全民网课”的时代,因为“网课”是一个热门话题,而当时的背景则是因为疫情原因无法上学(班),一时间远程会议/办公/教育变得炙手可热。所以,分析全年的热搜热度,可以让我们去关注每个月都发生了什么事情,而这样,我们就有了和这个世界建立联系的思绪,想想当时的你在做什么,心里又作何感想,这会是一件非常有趣的事情:

2020全年微博热搜热度变化趋势
2020全年微博热搜热度变化趋势

首先,我们看到的是:2020全年微博热搜热度变化趋势。通过这张图,我们可以注意到:在3月份左右国内疫情得到控制以后,大家都渐渐地回归到日常的工作和生活中,相应地,人们在社交媒体上的关注是逐渐下降的,直到7月份以后逐渐开始出现回升。我个人认为可能与下面这件事情有关,第一,是腾讯公司因为一份虚假合同而起诉老干妈的事件;第二、因为疫情而姗姗来迟的高考推迟到了7月7日和7月8日这两天;第三、张一山、宋妍霏、阚清子、宋茜等一众明星频频登上热搜榜。对于前两个因素,可以覆盖整个7月份的大多数时间段;对于第三个因素,更多的是从微博这样一个泛娱乐化的平台的属性去考虑,还有什么比吃明星的瓜更开心的事情吗?再往后,我们都知道,迎来了美国大选,不管这场大选闹出了多少风波,此时此刻,终于尘埃落定。

2020全年微博热搜数量变化趋势
2020全年微博热搜数量变化趋势

接下来,我们看到的是:2020全年微博热搜数量变化趋势。通过这张图,我们可以注意到:热搜数量的变化趋势整体上是吻合热搜热度的变化趋势的,两者的“低谷”都出现在7月份,不同的是热搜数量的变化要更为“缓和”一点,这可能和新浪微博的热搜榜单有一定的关系,不知道是不是因为微博的推荐算法,决定了每个月“吃瓜”的次数是差不多的,可如果没有算法来约束这一切,完全由用户及其粉丝自行主导,这会不会演变成现实版的美国大选呢?我特别心疼那位新浪微博的研发小哥@丁振凯人生中三次遭遇热搜引发的“宕机”:结婚时撞上鹿晗公布恋情,海外度假时撞上双宋官宣、老婆待产撞上华晨宇承认和张碧晨未婚生有一女,简直永远都在扩容的路上,被誉为“史上最惨新浪程序员”一点都不冤枉啊……

全年热搜情感分析

李诞在2020年年底策划了一期反跨年晚会,从头到尾都是脱口秀这种“语言类”节目,在这期节目里,有人以毛不易的“歌词”调侃了2020年大家的心境变化,从“像我这样优秀的人”到“消愁”,有时候打脸就是这么的猝不及防。坦白来说,我有段时间过得特别“”,“”到要靠《当幸福来敲门》来打鸡血。那么,整个2020年“”在热搜里的人们的心态变化又是怎么样的呢?所以,接下来我们通过 SnowNLP 对2020年全年的热搜话题的情感倾向进行分析,到底大家是过得“积极”还是“消极”呢,让我们一起拭目以待,为了达到更好的效果,博主提前对 SnowNLP 进行了训练,因为 SnowNLP 自带的语料库主要是电商评论,与我们此刻的场景多少有一点差异。

2020全年微博热搜情感变化趋势
2020全年微博热搜情感变化趋势

果然,2020年真的是“”到家啦,366天里平均置信概率在0.5以上的堪称寥寥啊。我有时候会想,我们常常希望在感情中有足够的安全感,希望对方可以“懂”我。诚然,我可以从一个人的朋友圈、微博去分析对方的情感变化,可身为人类的我们,并不是冷冰冰的计算机器。多年后,当我懊恼于曾经没有进行及时的沟通的时候,我静静地坐在电脑面前,你说这些字里行间没有透露出足够充足地信息,可我们依然有办法去反映过去一年里的喜怒哀乐。世事无常,每天都开开心心地面对,固然是心向往之,而生命中更朴实无华地大多数时刻,其实就是此刻如白开水一般索然无味,如果理性的思维最终还是要输给感性的直觉,我希望我可以两者兼有之,今年可能要在外地一个人度过春节啦,希望我的心情可以超过0.5呢……

全年热搜词云分析

其实,在做这个分析的时候,我一直在想,也许“新冠”或者“疫情”这样的字眼会成为2020年的共同记忆吧!至少对博主这样即将步入中年的90后而言,这场疫情留下的深刻记忆丝毫不亚于08年的汶川地震。可转念间又安慰自己道,相比国外愈演愈烈的疫情,我们在三月份左右的时候就基本得到了控制,如果说互联网是没有记忆的,人们对这一切应该会遗忘地非常快,就像这热搜榜上的话题,简直是“你方唱罢我登场”。可惜,互联网的确是有记忆的,即使过去了整整一年,这一切还是通过数据被挖掘出来。这里,我们通过结巴分词对热搜话题进行分词,再通过这些关键词来绘制词云。对于这个结果,突然就变得感性起来,可能这就是所谓的“冥冥之中自有天意”吧,甚至对于2021年来说,疫情目前依然是人们关注的热搜话题:

2020年全年微博热搜关键词词云
2020年全年微博热搜关键词词云

全年热搜人物分析

曾经在知乎上读到过这样一句话,“人们宁愿去关心一个蹩脚电影演员的吃喝拉撒和鸡毛蒜皮,而不愿了解一个普通人波涛汹涌的内心世界”,这句话如果放到2020年的语境中,或许就是,人们在危难的时候会突然关心“国士无双”,而在安稳的时候则会更关注“娱乐八卦”,考虑到新浪微博是借鉴新浪博客的“名人效应”而起家,所以,我更关心在过去一年里有哪些人都登上过热搜。说实话,我挺怀念某位七十多岁高龄的老人,他和我奶奶差不多同龄,在这个“丧”如此普遍的年代,他带给了我们多少欢乐啊,虽然我预感到会有许多明星靠着“否认”、“道歉”、“心疼”、“回应”、“声明”等等字眼而登上热搜,可我还是想知道答案啊……

2020全年微博热搜上榜人物分析.png
2020全年微博热搜上榜人物分析.png

果然,“说曹操曹操到”,2020年以压倒性优势多次登上微博热搜的,居然真的是前美国总统特朗普。虽然说这位美国前总统喜欢孜孜不倦地发推特,史称“推特治国”,可在一个某明星代孕风波快速令“拼夕夕”事件烟消云散的社交平台上,这位老人能频频进入我们的视野,大概就能说明过去一年里国际形势的风起云涌。我们嘲笑他为“懂王”,甚至“亲切”地称之为“川建国”同志。有一段时间里,好像每一个人都觉得自己比这位老人更会做总统;同样地,好像每一个人都觉得自己比张小龙更懂得微信。我无意讨论政治相关的东西,可我依然感谢这位老人在疫情期间带给我们的欢乐,因为我并不觉得,他像媒体眼中的那样滑稽而愚蠢,一个能在商人、明星和总统多重身份中切换自如的人,无论如何会都有他的过人之处,疫情这件事情,换一个人来当这个总统未必会做得比他好。回过头来看,他在2020年都做了哪些事情呢?

2020年特朗普的微博热搜
2020年特朗普的微博热搜

其实,在规划这篇博客的时候,我一直在想,该以一种什么样的心态去回顾2020,因为当我看着“别人”的年终总结的时候,总有一种难以言说的失落感。一方面,时间在不经意间匆匆逝去,身边的一切都在刻意地想你强调着“物是人非”。而另一方面,你需要去面对诸如买房、结婚这种所谓“某某年龄应该去做的事情”。当我看到身边的同事,整天坐在一起讨论的无外乎是房子、车子、股票等一切所谓“投资”的事情的时候,我时而会觉得他们有一点枯燥,就是那种我们曾经都不愿意成为的“中年人”。等翻过年,我即将迎来我的29岁,可令人心动的Offer里的“背水辉”一样的被嫌弃的年纪,而距离IT行业所谓的“35岁”门槛还剩下年时间。

虽然给自己订了几个目标,可有时候难免会感到懈怠,尤其是当你意识到你再无法抓住某一样东西的时候,或许,你唯一的能做的事情,就是让自己永远不要忘记吧!写数据挖掘相关的内容,不管是在数据的抓取还是分析阶段,都需要投入大量的精力去试验,结合实际去调整写作的方向,在这篇博客中甚至还花了大量时间去训练 SnowNLP。“悟已往之不谏,知来者之可追”,2021年flag我在心里记下来,我不想写出来,因为我怕到时候脸会疼,如果大家觉得这篇博客对你有帮助,欢迎点赞收藏,如果可以一键三连,那就更好啦!2020,再见!


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK