爬取网易云音乐热歌榜:从入门到实战
前提声明
- 爬虫应遵守目标网站的
robots.txt
协议,尊重版权和用户隐私。 - 本代码仅供学习和研究使用,不得用于商业用途。
- 请确保在合法合规的前提下使用本代码。
- 本代码所爬音乐为公开可选择的音乐
目录
引言
在数字化时代,音乐已成为我们日常生活中不可或缺的一部分。网易云音乐以其丰富的音乐资源和个性化推荐系统,赢得了广大用户的喜爱。然而,你是否想过,如何将这些音乐资源爬取下来,以便在没有网络的情况下也能随时欣赏呢?本文将带你走进爬虫的世界,手把手教你如何爬取网易云音乐热歌榜。
环境准备
在开始之前,确保你的开发环境中安装了以下Python库:
requests
:用于发起网络请求。re
:用于正则表达式匹配。os
:用于操作系统功能,如文件路径管理。
如果尚未安装,可以通过以下命令进行安装:
pip install requests
代码解析
1. 榜单ID与名称映射
首先,我们定义了一个榜单ID与名称的映射字典bangdan_dict
,方便后续代码中使用。
bangdan_dict = {
'19723756': '飙升榜',
'3779629': '新歌榜',
'2884035': '原创榜',
'3778678': '热歌榜'
}
2. 用户输入
接着,程序会提示用户输入想要下载的榜单ID和歌曲数量。
bangdan_id = input('请输入你想下载的榜单ID:')
num_songs = int(input('请输入要下载的歌曲数量:'))
3. 文件夹创建
根据用户输入的榜单名称,创建一个文件夹以存储下载的歌曲。
filename = 'D:/网易云热歌榜/' + bangdan_dict[bangdan_id] + "\\"
if not os.path.exists(filename):
os.makedirs(filename)
4. 发起网络请求
使用requests
库发起对网易云音乐榜单页面的请求,并设置合适的User-Agent
以模拟浏览器访问。
url = f"https://music.163.com/discover/toplist?id={bangdan_id}"
headers = {
"User-Agent": "Mozilla/5.0 ..."
}
response = requests.get(url=url, headers=headers)
5. 正则表达式提取
使用正则表达式从响应内容中提取歌曲ID和标题。
html_data = re.findall(r'<li><a href="/song\?id=(\d+)">(.*?)</a>', response.text)[:num_songs]
6. 音乐下载
对于每首歌曲,构建音乐播放地址,发起请求并下载音乐文件。
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
7. 文件保存
将下载的音乐保存到之前创建的文件夹中,并清理文件名中的特殊字符。
cleaned_title = re.sub(r'[\\/*?:"<>|]', '', title)
with open(os.path.join(filename, f"{cleaned_title}.mp3"), 'wb') as file:
file.write(music_content)
结语
通过本文,你已经学会了如何使用Python爬取网易云音乐热歌榜。这不仅是一次编程实践,更是对网络请求、正则表达式和文件操作的深入理解。希望你能将所学应用到更多有趣和有益的项目中去。
效果展示
总结
在数字化时代,音乐已经成为我们生活中不可或缺的一部分。网易云音乐以其丰富的音乐资源和个性化推荐系统,赢得了广大用户的喜爱。本文旨在通过Python编程,手把手教读者如何爬取网易云音乐热歌榜,以便在没有网络的情况下也能随时欣赏音乐。
首先,我们介绍了爬虫的前提声明,强调了遵守目标网站的robots.txt协议,尊重版权和用户隐私的重要性。接着,我们进行了环境准备,确保开发环境中安装了必要的Python库,如requests、re和os。
在代码解析部分,我们详细讲解了如何通过榜单ID与名称映射、用户输入、文件夹创建、发起网络请求、正则表达式提取、音乐下载和文件保存等步骤来实现爬取网易云音乐热歌榜的功能。我们定义了一个榜单ID与名称的映射字典bangdan_dict,方便后续代码中使用。然后,程序会提示用户输入想要下载的榜单ID和歌曲数量,并根据用户输入的榜单名称创建一个文件夹以存储下载的歌曲。
使用requests库发起对网易云音乐榜单页面的请求,并设置合适的User-Agent以模拟浏览器访问。通过正则表达式从响应内容中提取歌曲ID和标题,然后构建音乐播放地址,发起请求并下载音乐文件。最后,将下载的音乐保存到之前创建的文件夹中,并清理文件名中的特殊字符。
通过本文,读者已经学会了如何使用Python爬取网易云音乐热歌榜。这不仅是一次编程实践,更是对网络请求、正则表达式和文件操作的深入理解。希望读者能将所学应用到更多有趣和有益的项目中去。如果有任何问题或需要进一步的帮助,请随时联系作者。
全部代码
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" : "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/121.0.0.0 Safari/537.36"
}
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下载成功")