爬取网易云音乐热歌榜:从入门到实战


爬取网易云音乐热歌榜:从入门到实战

前提声明

  • 爬虫应遵守目标网站的robots.txt协议,尊重版权和用户隐私。
  • 本代码仅供学习和研究使用,不得用于商业用途。
  • 请确保在合法合规的前提下使用本代码。
  • 本代码所爬音乐为公开可选择的音乐

目录

  1. 引言
  2. 环境准备
  3. 代码结果
  4. 代码解析
    • [1. 榜单ID与名称映射](#1. 榜单ID与名称映射)
    • [2. 用户输入](#2. 用户输入)
    • [3. 文件夹创建](#3. 文件夹创建)
    • [4. 发起网络请求](#4. 发起网络请求)
    • [5. 正则表达式提取](#5. 正则表达式提取)
    • [6. 音乐下载](#6. 音乐下载)
    • [7. 文件保存](#7. 文件保存)
  5. 结语
  6. 全部代码

引言

在数字化时代,音乐已成为我们日常生活中不可或缺的一部分。网易云音乐以其丰富的音乐资源和个性化推荐系统,赢得了广大用户的喜爱。然而,你是否想过,如何将这些音乐资源爬取下来,以便在没有网络的情况下也能随时欣赏呢?本文将带你走进爬虫的世界,手把手教你如何爬取网易云音乐热歌榜。

环境准备

在开始之前,确保你的开发环境中安装了以下Python库:

  • requests:用于发起网络请求。
  • re:用于正则表达式匹配。
  • os:用于操作系统功能,如文件路径管理。

如果尚未安装,可以通过以下命令进行安装:

bash 复制代码
pip install requests

代码解析

1. 榜单ID与名称映射

首先,我们定义了一个榜单ID与名称的映射字典bangdan_dict,方便后续代码中使用。

python 复制代码
bangdan_dict = {
    '19723756': '飙升榜',
    '3779629': '新歌榜',
    '2884035': '原创榜',
    '3778678': '热歌榜'
}

2. 用户输入

接着,程序会提示用户输入想要下载的榜单ID和歌曲数量。

python 复制代码
bangdan_id = input('请输入你想下载的榜单ID:')
num_songs = int(input('请输入要下载的歌曲数量:'))

3. 文件夹创建

根据用户输入的榜单名称,创建一个文件夹以存储下载的歌曲。

python 复制代码
filename = 'D:/网易云热歌榜/' + bangdan_dict[bangdan_id] + "\\"
if not os.path.exists(filename):
    os.makedirs(filename)

4. 发起网络请求

使用requests库发起对网易云音乐榜单页面的请求,并设置合适的User-Agent以模拟浏览器访问。

python 复制代码
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和标题。

python 复制代码
html_data = re.findall(r'<li><a href="/song\?id=(\d+)">(.*?)</a>', response.text)[:num_songs]

6. 音乐下载

对于每首歌曲,构建音乐播放地址,发起请求并下载音乐文件。

python 复制代码
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. 文件保存

将下载的音乐保存到之前创建的文件夹中,并清理文件名中的特殊字符。

python 复制代码
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爬取网易云音乐热歌榜。这不仅是一次编程实践,更是对网络请求、正则表达式和文件操作的深入理解。希望读者能将所学应用到更多有趣和有益的项目中去。如果有任何问题或需要进一步的帮助,请随时联系作者。
全部代码

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下载成功")
相关推荐
封步宇AIGC5 分钟前
量化交易系统开发-实时行情自动化交易-4.1.4.A股布林带(BOLL)实现
人工智能·python·机器学习·数据挖掘
sun_weitao11 分钟前
括号匹配算法
开发语言·python
敲代码不忘补水40 分钟前
Python Matplotlib 数据可视化全面解析:选择它的七大理由与入门简介
开发语言·python·信息可视化·numpy·pandas·matplotlib
傻啦嘿哟44 分钟前
深入探索Python数据可视化:自定义颜色映射、标签与进阶技巧
python
易辰君1 小时前
【Python爬虫实战】深入解析 Scrapy 爬虫框架:高效抓取与实战搭建全指南
开发语言·爬虫·python
风动也无爱1 小时前
Java的正则表达式和爬虫
java·爬虫·正则表达式
数据小爬虫@2 小时前
如何利用Python爬虫精准获得1688店铺的所有商品信息
开发语言·爬虫·python
初晴~2 小时前
【spring】参数校验Validation
java·c++·spring boot·后端·python·spring·validation
安静读书2 小时前
Java解析视频FPS(帧率)、分辨率信息
java·python·音视频
z5418383 小时前
装饰器---python
开发语言·python