实战!Python 偷偷告诉你小姐姐的听歌喜好

作为网易云村的深度用户,网易云音乐应该是我除了微信外打开时间最长的 App 了。并不是应为网易云上面的歌曲多,而是因为那些走心的评论。边听歌边刷评论,感觉就像是走进了他人的人生之中,从另外一种意义来讲也是让自己有限的人生得以延长,变得更加多姿多彩。

直到有一天我像往常一样划拉着评论,一不小心手指触碰到了某个用户的昵称,然后就去到了他的个人主页。咦,原来这里是可以点进去的啊,在他的个人主页我可以看到他的听歌排行榜、创建的歌单以及收藏的歌单,而且我并没有关注他。

此时的我突然灵机一动,岂不是可以用这个来查看小姐姐最近都在听什么类型的歌,而且歌曲在一定程度上还反映了听歌人的心情,真是一举两得呀。

接口分析

首先我们进打开网易云网页版,随便选取一首歌后进入其评论列表,然后再选取一个评论者进入到他的个人主页,不出意外的话就可以看到他最近的听歌排行了。

来,我们观察下 URL,它应该像是下面这个样子的。为了保护用户隐私我隐藏了最后四位数字。仔细看这 URL 我们猜测最后的参数应该是用户的唯一 ID 标识,那么我们如何才能获取到小姐姐的网易云 ID 呢。别急,下文会说。

1
https://music.163.com/#/user/home?id=4682****

接着按 F12 打开浏览器开发者调试窗口,刷新页面分析下网络请求。

嗯,就是这个接口了,返回的数据有 100 条记录,我们可以点击网页「听歌排行」右下角的「查看更多」来确认下,发现确实是只能查看最近的 100 首,

获取数据

接口获取到了,剩下获取数据的工作就不难了,直接写一个爬虫爬下来即可。

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
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":...

注意,因为我们最后要获取的是歌手的名字。所以,需要将获取到的数据结果格式化一下。

1
2
3
4
5
6
7
result = json.loads(req.text)
names = []
for i in range(100):
    names.append(result['allData'][i]['song']['ar'][0]['name'])

# 准备生成云图的字符串
text = ",".join(names)

生成云图

最后,将我们上面获取到的歌手集合生成一张词云图即可。

1
2
3
4
5
6
7
8
9
10
11
12
13
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就是用户唯一标识了。

1
https://y.music.163.com/m/song?id=4587****&userid=4682****&from=message

总结

今天我们总结了如何用 Python 来获取小姐姐的最近听歌排行榜,如果以后觉得没有什么话题可聊的话就从她喜欢的歌曲开始吧。小伙伴们都学会了么?

代码地址

示例代码:https://github.com/JustDoPython/python-examples/tree/master/doudou/2020-06-22-music-163

Python Geek Tech wechat
欢迎订阅 Python 技术,这里分享关于 Python 的一切。