ISEE小语
本次爬取网易云音乐特色榜的Top10、Top20、Top50……的歌曲。
无需登录或是设置其他特殊配置,直接下载哟~!
环境:
Pycharm
Python 3.9.16
导入:
from os import mkdir
from os.path import isfile, isdir
from re import findall
from 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/'}
(左右滑动查看完整代码)
以上的基础信息已经准备好
接下来按实战操作结构,我们来下载歌曲
3 创建音乐保存地址
我们指定下载后的音乐文件保存的路径
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”即可获取源码!
寄语:世间三美,明月,清风,眼前……
看到这儿的朋友帮点个“赞”和“在看”,谢谢支持~!
文章就分享到这儿,喜欢就点个赞吧!