爬取网易云音乐并下载歌曲通常涉及以下步骤:
环境准备
导入必要的Python模块,如`requests`、`re`(正则表达式)和`os`(文件操作)。
创建一个用于保存下载文件的目录。
发送HTTP请求
使用`requests`库向网易云音乐的API或网页发送请求,获取歌曲列表或特定歌曲的信息。
解析网页内容
利用`re`模块从网页响应中提取歌曲ID和标题。
使用`lxml`或`BeautifulSoup`等库解析HTML内容,找到音乐文件的下载链接。
下载音乐文件
根据解析出的下载链接,使用`urllib.request`或`requests`库下载MP3文件到本地指定目录。
异常处理
在下载过程中处理可能出现的异常,如网络错误、无效链接等。
import os
import re
import requests
from bs4 import BeautifulSoup
创建保存下载音乐的文件夹
filename = 'musicLibs'
if not os.path.exists(filename):
os.mkdir(filename)
设置请求头,模拟浏览器访问
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.132 Safari/537.36'
}
请求网易云音乐搜索页面
url = 'https://music.163.com/discover/toplist'
response = requests.get(url, headers=headers)
解析搜索结果页面,提取歌曲信息
soup = BeautifulSoup(response.text, 'html.parser')
songs = soup.find_all('a', href=re.compile('/song'))
for song in songs:
提取歌曲ID和标题
song_id = re.findall(r'id=(\d+)', song['href'])
song_name = song.text
构造下载链接
download_url = f'http://music.163.com/song/media/outer/url?id={song_id}.mp3'
下载歌曲
try:
urllib.request.urlretrieve(download_url, os.path.join(filename, f'{song_name}.mp3'))
print(f'{song_name} 已成功下载到本地')
except Exception as e:
print(f'下载 {song_name} 时发生错误: {e}')
请注意,网易云音乐的页面结构可能会发生变化,因此上述代码可能需要根据实际情况进行调整。同时,确保遵循网易云音乐的使用条款和条件,以及当地版权法规。