Python下载网易云音乐特色榜Top歌曲,完整版(附源码)

文摘   科技   2024-06-02 19:15   北京  


ISEE小语


“一个人,只要满足了基本生活所需,不再汲汲于声名,不再汲汲于富贵,便可以更从容,更充实地享受人生。”
——梭罗《瓦尔登湖》


本次爬取网易云音乐特色榜的Top10、Top20、Top50……的歌曲

无需登录或是设置其他特殊配置,直接下载哟~!



环境:

Pycharm

Python 3.9.16



导入:

from os import mkdirfrom os.path import isfile, isdirfrom re import findallfrom urllib.request import Request, urlopen

(左右滑动查看完整代码)





1 网站地址


首先,先确定特色榜网站地址

飙升榜地址

# 音乐飙升榜地址top_music_url = 'https://music.163.com/discover/toplist?id=19723756'

(左右滑动查看完整代码)


新歌榜地址

# 音乐新歌榜地址new_music_url = 'https://music.163.com/discover/toplist?id=3779629'

(左右滑动查看完整代码)


原创榜地址

# 音乐原创榜地址src_music_url = 'https://music.163.com/discover/toplist?id=2884035'

(左右滑动查看完整代码)


热歌榜地址

# 音乐热歌榜地址hot_music_url = 'https://music.163.com/discover/toplist?id=3778678'

(左右滑动查看完整代码)


2 头信息


头信息,即headers信息 

# 设置浏览器头信息headers = {'Content-Type': 'text/html;charset=utf8',           'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/125.0.0.0 Safari/537.36',           'Referer': 'https://music.163.com/'}

(左右滑动查看完整代码)


headers可以在浏览器中获取
打开浏览器,按下F12键,输入网站链接,在Network中可以看到。




以上的基础信息已经准备好


接下来按实战操作结构,我们来下载歌曲



3 创建音乐保存地址


我们指定下载后的音乐文件保存的路径

定义函数 music_folder,
首先,检查目录是否存在?
如果不存在,则新创建。

def music_folder(folder_path):    """    :param folder_path: 是一个字符串,用来指定文件夹的路径    :return:     """    if not isdir(folder_path):        mkdir(folder_path)    return folder_path

(左右滑动查看完整代码)


比如,我们在当前目录下创建音乐保存的music文件夹

# 音乐保存文件夹路径folder_ = r'./music'folder = music_folder(folder_)

(左右滑动查看完整代码)




4 提取音乐的id和名字


提取榜单上音乐的id和名字

def get_music(url, top_num, headers):    """    :param url: 榜单地址    :param top_num: 排名    :param headers: 页面头信息    :return:    """    response = Request(url, headers=headers)    # 读取网页源代码    with urlopen(response) as fp:        content = fp.read().decode()    # 提取音乐id和名字    pattern = r'<li><a href="/song\?id=(.+?)">(.+?)</a></li>'    music_msg = findall(pattern, content)[:top_num]    return music_msg

(左右滑动查看完整代码)


以飙升榜为例,提取Top10的歌曲id和名字


# 音乐飙升榜地址top_music_url = 'https://music.163.com/discover/toplist?id=19723756'top_10_music = get_music(top_music_url, 10, headers)
print(top_10_music)

(左右滑动查看完整代码)


结果:

[('2161155720', '雨天雨天 (live)'), ('2161527760', '不如回家喝自来水 (Live版)'), ('473740829', '雨天'), ('2161527734', '迷宫 (Live版)'), ('2161154646', '拯救 (live)'), ('346083', 'Amani'), ('2110700883', '冬眠'), ('28892418', '原来'), ('2161527938', '感官先生 (Live版)'), ('2120854665', 'Red Moon')]




5 定义歌曲名字


定义歌曲名字,默认是mp3格式的

def music_file(folder, music_name):    """    :param folder: 音乐保存的文件夹    :param music_name: 歌曲名字    :return:    """    m_file = rf'{folder}\{music_name}.mp3'    if isfile(m_file):        return None    return m_file

(左右滑动查看完整代码)


歌曲保存的名字

music_file_name = music_file(r'./music', '雨天雨天 (live)')
print(music_file_name)

(左右滑动查看完整代码)

结果是这样的:



6 下载并保存歌曲


注意:如果歌曲下载地址中出现

http://music.163.com/404

或者

https://music.163.com/404

的时候,一般是指付费的音乐是无法下载的链接。

以下做了处理,如果出现无法下载的,直接提示并跳过

def download_music(_music_id, music_name, folder, headers):    """    :param _music_id: 歌曲id    :param music_name: 歌曲名字    :param folder: 保存地址    :param headers: 头信息    :return:     """    music_name = music_name.replace("/", "")    _music_file = music_file(folder, music_name)    if _music_file:        # 单歌曲下载地址        download_url = rf'https://music.163.com/song/media/outer/url?id={_music_id}'        req = Request(download_url, headers=headers)        with urlopen(req) as fp:            content = fp.read()        # 下载地址        inner_url = req.redirect_dict        inner_url_keys = list(inner_url.keys())        if "http://music.163.com/404" in inner_url_keys:            return f"【{music_name}】——是付费歌曲,禁止下载!"        with open(_music_file, 'wb') as fp:            fp.write(content)        return f"【{music_name}】——下载完成"    return f"【{music_name}】——已下载,无需重复下载!"

(左右滑动查看完整代码)


最后,我们下载飙升榜Top10的歌曲


print("开始下载……")# 音乐保存地址folder_ = r'./music'folder = music_folder(folder_)# Header信息headers = {'Content-Type': 'text/html;charset=utf8',           'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/125.0.0.0 Safari/537.36',           'Referer': 'https://music.163.com/'}# 音乐飙升榜地址top_music_url = 'https://music.163.com/discover/toplist?id=19723756'top_10_music = get_music(top_music_url, 10, headers)for music_id, music_mame in top_10_music:    resp_result = download_music(music_id, music_mame, folder, headers)    print(resp_result)
print("下载完成!")

(左右滑动查看完整代码)



以下载的是飙升榜Top10的歌曲

如果需要下载Top20、Top50、Top100……怎么操作呢?

只需要定义提取榜单上音乐的id和名字的方法get_music中top_num参数,20、50、100……即可


其他【新歌榜】、原创榜】、热歌榜】下载方式一样,只需要换成不同的榜单地址即可!


7 总结


以上实例仅限个人观点,学习使用

完整的代码已经整理

后台回复“spider_music”即可获取源码!



寄语:世间三美,明月,清风,眼前……



看到这儿的朋友帮点个“”和“在看”,谢谢支持~!

     

文章就分享到这儿,喜欢就点个吧!




推荐阅读  点击标题可跳转


ISEE小栈
没有花里胡哨,简单才是王道。
 最新文章