直接看效果:
背景:
为了从网易云音乐的榜单中下载指定数量的歌曲。网易云音乐提供了多种音乐榜单,如飙升榜、新歌榜、原创榜和热歌榜,每个榜单都有一个唯一的ID。用户可以通过输入榜单ID和希望下载的歌曲数量,程序将自动从相应的榜单中提取歌曲信息并下载这些歌曲。
代码首先定义了一个字典,将榜单ID与对应的榜单名称关联起来。接着,程序会提示用户输入想要下载的榜单ID和歌曲数量。然后,程序会创建一个文件夹来存储下载的歌曲,文件夹的名称基于所选榜单的名称。
接下来,程序会构建请求URL并发送请求,以获取榜单页面的HTML内容。使用正则表达式,程序从HTML中提取出歌曲的ID和标题。对于每首歌曲,程序会构建音乐的播放地址,并请求该地址以下载音乐文件。下载完成后,程序会将音乐文件保存到之前创建的文件夹中,并确保文件名不包含任何特殊字符,以避免文件保存时出现错误。
这种自动化下载的方式大大简化了用户手动下载歌曲的过程,使得用户能够快速获取自己喜欢的音乐。
直接上代码:
import requests
import re
import os
# 榜单ID对应的字典
bangdan_dict = {
'19723756': '飙升榜',
'3779629': '新歌榜',
'2884035': '原创榜',
'3778678': '热歌榜'
}
print("榜单对应的ID如下:", bangdan_dict)
# 输入榜单ID
bangdan_id = input('请输入你想下载的榜单ID:')
# 输入要下载的歌曲数量
num_songs = int(input('请输入要下载的歌曲数量:'))
# 创建文件夹路径
filename = 'D:/网易云热歌榜/' + bangdan_dict[bangdan_id] + "\\"
if not os.path.exists(filename):
os.makedirs(filename)
# 请求榜单页面
url = f"https://music.163.com/discover/toplist?id={bangdan_id}"
headers = {
"User-Agent" : "你自己的"
}
response = requests.get(url=url, headers=headers)
# 使用正则表达式提取歌曲信息
html_data = re.findall(r'<li><a href="/song\?id=(\d+)">(.*?)</a>', response.text)[:num_songs]
for song_id, title in html_data:
# 构建音乐播放地址
music_url = f"http://music.163.com/song/media/outer/url?id={song_id}.mp3"
# 请求音乐播放地址并下载音乐
music_content = requests.get(url=music_url, headers=headers).content
# 清理文件名中的特殊字符
cleaned_title = re.sub(r'[\\/*?:"<>|]', '', title)
with open(os.path.join(filename, f"{cleaned_title}.mp3"), 'wb') as file:
file.write(music_content)
print(f"{bangdan_dict[bangdan_id]}中的{cleaned_title}.mp3下载成功")