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

热搜抓取

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

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

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

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

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

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

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

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33

# 获取指定日期对应的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,再见!