抓取网易云音乐歌曲热门评论生成词云
本文介绍了如何利用Python爬虫技术从网易云音乐获取热门评论,并通过词云工具将其可视化展示。文章详细描述了数据抓取过程(包括抓包分析、加密信息处理及评论获取),并展示了如何在WordCloud库中设置字体以解决中文乱码问题。最终生成的词云展示了热门评论中的关键词分布。文章还提到了可以进一步扩展的地方,如增加词云mask支持或批量爬取功能等。
-
-
前言
-
抓数据
- 抓包分析
- 加密信息处理
- 抓取热门评论内容
-
词云
- 词云运行效果
-
总结
-

前言
网易云音乐一直是我心驰神往的乐坛顶尖存在,在聆听某首歌曲时若能触碰到内心最深处的想法瞬间,总会想起"高山流水"的美好意境。因此我决定 today 进行数据采集,并通过生成词云的形式展示出来,以便直观地观察出这首歌曲最能触动内心感受的部分是什么。
做成词云的好处就是直观以及美观, 其他的我也想不出来有什么了。
抓数据
要想做成词云,首先得有数据才行。于是需要一点点的爬虫技巧。
- 抓包分析
- 加密信息处理
- 抓取热门评论内容
抓包分析
使用Chrome控制台。我们可以轻松的找到评论所在的链接。如下图:

目前我们已经成功获取了URL地址,并计划立即执行下一步操作——开始数据抓取工作。然而,在初步尝试后发现未能获得所需的具体信息,反而返回了一个空字符串。通过进一步分析得知浏览器采用的是POST请求方式,请参考下图中的详细字段信息。

加密信息处理
在对相关功能进行测试后,无需额外操作即可获取所需数据。然而要彻底解决这一加密问题,则需要补充相应的加解密知识储备。GitHub上已有详细解析网易云音乐字段加密方案的文章,感兴趣的朋友可深入参考该链接。
酷狗音乐 登录功能交互设计与实现
为了提高效率,在当前阶段我决定采用临时方法。这一方法具有良好的可复用性,在后续测试中将对这种方法的效果进行评估。
抓取热门评论内容
从第一步中获得了接口,在返回的数据字段中是一个JSON字符串,在获取后进行简单的处理即可使用。
# coding: utf8
# @Author: 郭 璞
# @File: 网易云音乐歌曲热门评论.py
# @Time: 2017/4/26
# @Contact: 1064319632@qq.com
# @blog:
# @Description: 热门评论获取
import requests
import json
def getcomments(musicid):
url = 'http://music.163.com/weapi/v1/resource/comments/R_SO_4_{}?csrf_token=5594eaee83614ea8ca9017d85cd9d1b3'.format(musicid)
payload = {
'params': '4hmFbT9ZucQPTM8ly/UA60NYH1tpyzhHOx04qzjEh3hU1597xh7pBOjRILfbjNZHqzzGby5ExblBpOdDLJxOAk4hBVy5/XNwobA+JTFPiumSmVYBRFpizkWHgCGO+OWiuaNPVlmr9m8UI7tJv0+NJoLUy0D6jd+DnIgcVJlIQDmkvfHbQr/i9Sy+SNSt6Ltq',
'encSecKey': 'a2c2e57baee7ca16598c9d027494f40fbd228f0288d48b304feec0c52497511e191f42dfc3e9040b9bb40a9857fa3f963c6a410b8a2a24eea02e66f3133fcb8dbfcb1d9a5d7ff1680c310a32f05db83ec920e64692a7803b2b5d7f99b14abf33cfa7edc3e57b1379648d25b3e4a9cab62c1b3a68a4d015abedcd1bb7e868b676'
}
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/57.0.2987.110 Safari/537.36',
'Referer': 'http://music.163.com/song?id={}'.format(musicid),
'Host': 'music.163.com',
'Origin': 'http://music.163.com'
}
response = requests.post(url=url, headers=headers, data=payload)
data = json.loads(response.text)
hotcomments = []
for hotcomment in data['hotComments']:
item = {
'nickname': hotcomment['user']['nickname'],
'content': hotcomment['content']
}
hotcomments.append(item)
# 返回热门评论
return [content['content'] for content in hotcomments]
if __name__ == '__main__':
hot = getcomments(439915614)
print(hot)
看下运行的结果吧。
['初恋很单纯,跟她好了快一年了,终于带她回家见家长。席间老妈不停的给她夹菜,“闺女,来,吃完了待会让他送你回去”。女友可能是误会我妈的意思了,立马放下碗筷,一脸委屈“叔叔阿姨你们别赶我走,我是真心喜欢他的,我以后少吃点”。听到女友说这句话,心瞬间化了。', '李玉刚合唱团已上线,女高音李玉刚、女低音李玉刚、男高音李玉刚、男低音李玉刚[大笑][大笑][大笑]', '2012年,那年大一,军训,我们相识。异乡的冬天冻伤了她的初恋,我却没有理由给她一个安慰的拥抱。此后的日子我们依然是朋友,偶尔碰面寒暄,而后走散在汹涌的人潮。她又有了一个他,继而凋谢。2015年,大三。我们一起散步,夜色的掩护下我向她表白了,她牵起我的手,哭着说:你终究说出来了。', '大学毕业后我去了北京,而她留在了老家,刚开始每天一个电话,后来越来越少,甚至断了联系,直到两年后的一次我坐火车回家,出了站之后看见她一个人站在外面,头发被风吹得很凌乱,看到我之后也没有动,我放下行李过去把她抱住,她立马大哭对我说我还以为你不要我了。那一刻起我就知道这辈子就是你。', '「刚」好「玉」见「李」', '96年离开家奔波闯荡,06年星光大道让全国观众认识了你,16年出道整十周年,你用十年时间向世界证明你不是当初那个初登央视舞台稚嫩的李玉刚,你是历经十年岁月积淀的玉先生,你是传播传统文化的先行者,你是摆脱桎梏追求艺术突破的追梦人 世界之大欣喜相逢 我们17日十周年演唱会见[亲亲]', '副歌有毒…画室今天放了三遍[大哭]第一次听这唱的什么鬼…第二次感觉还不错…第三次就开始中毒了拿起手机听歌识曲,单曲循环走起[大哭]', '曾经和一个女人躺在同一个床上一整夜,不是恋人。什么都没干,天南海北纯侃纯聊天。那天晚上我清唱了这首歌给她听。早上起来后,感觉双方之间亲密指数成几何增长到以前的n次方。现在,她是我的女人。再过几个月就结婚了。初恋,感谢刚好遇见你', '高一遇见他,考试的时候一见钟情,考试结束我去看了他桌子上的考号,他叫穆佳明,我喜欢他的名字,他去打球,不管多远我都会跑过去,他生病,我跑去买药,他运动会跑步,我去给他送水,用肚子暖好,我打针的时候知道他在附近打球,就跑过去,结果感冒加重,全世界都知道我很爱他,全世界都知道他不爱我', '相识7年,在一起却才8个月,怪我当初没有足够的勇气,没想到你会为我坚持那么久。感谢上天让我刚好遇见你,是你的坚持让我们最后能走在一起,希望你能在我的一生中留下漫长的回忆,我会珍惜这场来之不易的相遇。在今后的日子里,让我来给你走下去的勇气,给我机会保护你、呵护你,刘小瘦我爱你。。。', '大一异地,我放假早回来坐在网吧打魔兽,这首歌被点播了N遍,脑袋里有了简单的旋律:因为我刚好遇见你。 晚上抱着手机互说晚安,梦里梦到她了,现在刚醒,找到这首歌无限循环。 祝福所有异地恋终成眷属。[爱心]', '我们哭了,我们笑着。[大哭]开口就已经泪流满面,好怀念那段时光', '我用网易云音乐,当初的信任给她买的手机,给她安装了网易云登录了我的帐号,可她不怎么用,16年12月22号她送走了我,至今虽然不再联系就在昨天我突然发现我喜欢的音乐列表内多了一首歌就是这首《刚好遇见你》。', '因为我刚好遇见你 距离高考还有一百四十多天 和你成为同学大概一年多了 没想到你居然偷偷喜欢了我很久 这次我们省模拟考总分一模一样 要填模拟志愿 你说大学的事就交给我了 你说我们可以去北方看雪吃火锅 你说我喜欢的专业都不错 你说我们很有缘 可是啊 最重要的那一句 你怎么不说呢', '那年你18,我20。我去酒店实习,下班,刚好遇见你……我不相信一见钟情,可你是例外。现在,我25,你23。感谢你,来我的世界,就不曾离开。明年,我们要结婚了']
词云
我依赖于Python第三方库Wordcloud来生成词云图。可以通过pip安装该第三方库:pip。其官方网站提供了丰富的实例和详细的说明文档,请您移步访问以下链接获取更多信息:
https://amueller.github.io/word_cloud/auto_examples/index.html
下面就直接上代码好了。
然而,在官网或其他官方文档中也没有提到对中文字符的支持或处理方式。后来经过一番寻找和尝试后,终于发现了解决方案:那就是在WordCloud对象的构造函数中指定字体文件路径。具体来说就是在WordCloud对象的构造函数中指定字体文件路径。这样一来就能有效避免文字显示混乱的问题了。
WordCloud(random_state=1, font_path = r’C:/Users/Windows/fonts/simkai.ttf’)
# coding: utf8
# @Author: 郭 璞
# @File: 词云测试.py
# @Time: 2017/4/26
# @Contact: 1064319632@qq.com
# @blog:
# @Description: 词云测试
from wordcloud import WordCloud
from temp import 网易云音乐歌曲热门评论 as hot
text = " ".join(hot.getcomments(439915614))
wordcloud = WordCloud(random_state=1, font_path = r'C:/Users/Windows/fonts/simkai.ttf').generate(text)
import matplotlib.pyplot as plt
plt.figure()
plt.imshow(wordcloud, interpolation='bilinear')
plt.axis('off')
plt.show()
词云运行效果
最后来对比一下运行的效果。

总结
最后回顾一下内容时发现文章主要介绍了针对网易云音乐平台热门评论的数据获取与分析过程。具体而言,该文章通过网络爬取技术成功获取了相关用户评论数据,并运用专业的生成器工具,成功构建了相应的词云图表展示分析结果
可以拓展的地方:
基于特定主题的词云生成工具...可灵活配置颜色方案并导入图片。
无需额外信息即可完成热门评论的大规模采集。
将功能打包开发友好的API接口可为用户提供便捷的服务选择包括但不限于热评展示与智能分析等特色功能。
