作为网易云村的深度用户,网易云音乐应该是我除了微信外打开时间最长的 App 了。并不是应为网易云上面的歌曲多,而是因为那些走心的评论。边听歌边刷评论,感觉就像是走进了他人的人生之中,从另外一种意义来讲也是让自己有限的人生得以延长,变得更加多姿多彩。
直到有一天我像往常一样划拉着评论,一不小心手指触碰到了某个用户的昵称,然后就去到了他的个人主页。咦,原来这里是可以点进去的啊,在他的个人主页我可以看到他的听歌排行榜、创建的歌单以及收藏的歌单,而且我并没有关注他。
此时的我突然灵机一动,岂不是可以用这个来查看小姐姐最近都在听什么类型的歌,而且歌曲在一定程度上还反映了听歌人的心情,真是一举两得呀。
接口分析
首先我们进打开网易云网页版,随便选取一首歌后进入其评论列表,然后再选取一个评论者进入到他的个人主页,不出意外的话就可以看到他最近的听歌排行了。
来,我们观察下 URL,它应该像是下面这个样子的。为了保护用户隐私我隐藏了最后四位数字。仔细看这 URL 我们猜测最后的参数应该是用户的唯一 ID 标识,那么我们如何才能获取到小姐姐的网易云 ID 呢。别急,下文会说。
https://music.163.com/#/user/home?id=4682****
接着按 F12 打开浏览器开发者调试窗口,刷新页面分析下网络请求。
嗯,就是这个接口了,返回的数据有 100 条记录,我们可以点击网页「听歌排行」右下角的「查看更多」来确认下,发现确实是只能查看最近的 100 首,
获取数据
接口获取到了,剩下获取数据的工作就不难了,直接写一个爬虫爬下来即可。
import requests import json # 模拟浏览器请求 headers = { 'Referer': 'http://music.163.com/', 'Host': 'music.163.com', 'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.106 Safari/537.36', 'Accept': '*/*', } # 构建 URL 以及 POST 参数 url = 'https://music.163.com/weapi/v1/play/record?csrf_token=' data = { 'params': 'xrJhjXYUqEWa98DVbFtw6yTygOTCOvSAypxfWNr5kpw/MEvXsRk+Av+DNF7zY9a1oA95FBTXdW9s/MJV+eQVfCGi+/NVW7nD0igfJSsmDtE3VpM422dZR6WJGDxS3/se00qFFHx6wumfLzc9mgnfB5hGkrBwF9+P/7zamjfWSOUfvvUuWhM2Gd7z2pA11lMB', 'encSecKey': '2371bb4de91d5de7110722d3491c7cf6d3f6f5cdcbc16a5e9c7456e4b9075c1965d851d4920fa51adae6ff1c7b722539fb03dd2ab148894c2dc9c8ba0bbb5e95bbbd2bf4fbf02023cf63391f74b6956339cb72fa32a4413de347ffb536299f5711fe02fe60f66b77ac96a16a6bcb5ba14cf9b1609ddf8e8180d683bba5801acf' } # 发送 post 请求,第一个参数是 URL,第二个参数是请求参数 req = requests.post(url, data) print(json.loads(req.text)) # 输出结果 {"allData":[{"playCount":0,"score":100,"song":{"name":"盛夏光年 (2013版)","id":28181110,"pst":0,"t":0,"ar":[{"id":13193,"name":"五月天","tns":...
注意,因为我们最后要获取的是歌手的名字。所以,需要将获取到的数据结果格式化一下。
result = json.loads(req.text) names = [] for i in range(100): names.append(result['allData'][i]['song']['ar'][0]['name']) # 准备生成云图的字符串 text = ",".join(names)
生成云图
最后,将我们上面获取到的歌手集合生成一张词云图即可。
import matplotlib.pyplot as plt from wordcloud import WordCloud def show_word_cloud(text): wc = WordCloud(font_path='/System/Library/Fonts/PingFang.ttc', background_color="white", scale=2.5, contour_color="lightblue", ).generate(text) # 读入背景图片 WordCloud(background_color='white', scale=1.5).generate(text) plt.figure(figsize=(16, 9)) plt.imshow(wc) plt.axis('off') plt.show()
最后,万事俱备,就差小姐姐的网易云用户 ID 了。其实很简单,找一下她之前给你分享过的歌曲记录就可以啦,微信打开歌曲链接,点击右上角三个点,然后选择「复制链接」,之后你会得到类似下面的一个链接。没错,那个 userid
就是用户唯一标识了。
https://y.music.163.com/m/song?id=4587****&userid=4682****&from=message
总结
今天我们总结了如何用 Python 来获取小姐姐的最近听歌排行榜,如果以后觉得没有什么话题可聊的话就从她喜欢的歌曲开始吧。小伙伴们都学会了么?