一键下载网易云歌单

如果从网易云音乐内部直接下载,得到的是 ncm 文件,无法用其它音乐播放器打开,如果想要得到 mp3 格式的歌曲,则需要去一些特殊的下载网站,如 https://music.zhuolin.wang/, 手动搜索歌名然后下载,效率低下。

因此我实现了一个只需要输入网易云歌单链接就可以直接下载歌单内所有歌曲的程序,在此记录下使用方法和代码原理。

1、使用方法

运行 auto_download.exe 程序,会提示 “输入网页版歌单的链接”。打开网易云网页版,点开自己或者其他人创建的歌单,例如我创建的 Eason 的歌单,如下:

我的歌单

复制搜索框内的地址,此处为https://music.163.com/#/my/m/music/playlist?id=4974062786,粘贴至命令行内,回车。接下来会列出该歌单内的所有歌曲(上限1000首),输入 y 按回车即开始下载,输入 n 按回车即取消下载。

下载前

如果遇到资源失效的歌曲,会提示 “资源已失效,跳过下载”;

如果遇到 VIP 专享的资源,那么只会正常下载前面的一小段,不会报错,所以等全部下载完成后删除文件大小明显过小的歌曲就可以了。

2、原理介绍

1
2
3
4
5
6
7
8
headers = {
'Host': 'music.163.com',
'Referer': 'https://music.163.com/',
# Cookie 和 User-Agent 字段太长了,此处只截取前面一部分,具体请到我的 github 查看
'Cookie': 'nts_mail_user=yangding19thu@163.com:-1:1; <...> ',
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) <...> ',
'Accept': '*/*'
}

如果不提供 cookie,也能获取到歌单中歌曲的 id,但是只提供前10首,因为它认为你是一个未登陆的用户。只有加上了 cookie,网易云音乐网站才会认为你是一个已登陆的用户,向你提供该歌单全部歌曲的 id。

【Cookie 的获取方法】:以 Edge 浏览器为例,打开网页版网易云音乐界面,登录你的账号。然后按快捷键 Ctrl + Shift + I ,打开开发者工具,选择 网络 标签页,在搜索框中输入 config,刷新网易云音乐页面,点击搜索结果的第一条 config?csrf_token=... ,从里面可以复制出 CookieUser-Agent 等字段的信息。如下图:

cookie

将你的 CookieUser-AgentAccept 等信息填入 headers = {} 里面就可以了。

在这个过程中,我遇到了一个错误,大意是由于 Cookie 字段中存在不可解码的字符,导致程序无法运行,于是我将 Cookie 字段中包含中文的部分删除,便可以正常运行了。所以我猜测可能只需要提供一部分 cookie 就可以让服务器认出你来,而非一定要提供完整的 cookie。

【补充】:经测试,不是每台电脑只能用自己的 cookie,而是你拿任何一个人的 cookie 填进去都可以获得网易云音乐网站服务器的许可,所以你直接运行我的程序是没有任何问题的。

(2)读取歌单链接

1
2
3
url = input("输入网页版歌单的链接\n")
url = url.replace('/#/', '/')
url = url.replace('/my/m/music/', '/')

去掉歌单链接中无用的部分

(3)获取并打印歌单中所有歌曲的 id 和名字

1
2
3
4
5
6
7
8
9
10
11
12
13
14
response = requests.get(url=url, headers=headers)
html = response.content.decode(encoding="utf-8")

soup = BeautifulSoup(html, 'lxml')
results = soup.find('ul', {'class': 'f-hide'})
results = results.find_all('a')

print("将要下载的歌单为:{}\n".format(soup.find('title').text))

print("包含如下歌曲:")
cnt = 0
for music in results:
cnt += 1
print("{}. {}".format(cnt, music.text))

html 是歌单链接对应的网页的内容,Beautiful Soup 是一个可以从HTML或XML文件中提取数据的Python库。具体用法可查阅文档: Beautiful Soup 4.4.0 文档 — Beautiful Soup 4.2.0 中文 文档

手动将 html 的内容复制出来,在一个示例中,html 文件中含有歌曲id和名称的部分如下:

1
<ul class="f-hide"><li><a href="/song?id=29567190">梦中的哈德森</a></li><li><a href="/song?id=421563096">我们的时光</a></li><li><a href="/song?id=421423203">背影</a></li><li><a href="/song?id=29567189">理想</a></li><li><a href="/song?id=456185373">成都 (Live)</a></li><li><a href="/song?id=459159128">理想 (Live)</a></li><li><a href="/song?id=461811714">三十岁的女人 (Live)</a></li><li><a href="/song?id=202373">南方姑娘</a></li><li><a href="/song?id=1410021043">小人物</a></li><li><a href="/song?id=460628183">月亮粑粑 (Live)</a></li></ul>

所以使用

1
2
results = soup.find('ul', {'class': 'f-hide'})
results = results.find_all('a')

这两句就可以获取所有歌曲的id和name。

(4)创建存储下载歌曲的文件夹

1
2
path = './auto_download/'+ curr_time
Path(path).mkdir(parents=True, exist_ok=True)

在当前路径下创建 auto_download 文件夹,在其中又创建以现在日期为文件名的子文件夹,如 ./auto_download/2022-02-24

(5)开始下载

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
cnt = 0
for music in results:
cnt += 1
music_id = music['href'].split("=")[1]
music_name = music.text

music_name = re.sub('/|\*|"', ' ', music_name)
music_name = music_name.replace(':', ':')
music_name = music_name.replace('?', '?')
music_name = music_name.replace('<', '《')
music_name = music_name.replace('>', '》')
music_name = music_name.replace('|', ' ')
music_name = music_name.replace('\\', ' ')

music_url = "https://link.hhtjim.com/163/{}.mp3".format(music_id)

print("进度{}/{}, 正在下载 <{}>".format(cnt, len(results), music_name))

try:
urllib.request.urlretrieve(music_url, path + '/' + music_name + '.mp3')
except urllib.error.HTTPError:
print("资源已失效,跳过下载")

其中替换 music_name 一段是因为有些歌曲名称中含有非法的字符,在将下载好的文件保存到本地时会报错,所以用其它字符来替代它们。非法字符包含下面这些。

非法字符

https://link.hhtjim.com 是外链转换工具,可以生成网易云、QQ、虾米、酷我等主流音乐平台的下载外链。

try ... except 一段是防止为了下载歌单中已失效的资源而出错,打断下载流程。

3、打包成 exe

我使用的是 pyinstaller,一个用于打包 python 文件为 exe 可执行文件的包。

参考文档: Using PyInstaller — PyInstaller 4.9 documentation

使用命令 pyinstaller -F auto_download.py 即可,在当前路径的 dist 文件夹中就可以找到已经打包完成的 exe 文件。

4、源码和可执行程序下载

源码地址:https://github.com/yang-d19/MusicDownload

可执行程序下载:https://github.com/yang-d19/MusicDownload/blob/main/dist/auto_download.exe

5、参考博客

Author

Ding Yang

Posted on

2022-02-20

Updated on

2024-01-27

Licensed under