Python 爬虫实战:Request+urllib 模块批量下载飙歌榜音乐文件
前言
本文介绍如何使用 Python 的 urllib 和 requests 相关技术,爬取网易云音乐飙升榜的音频数据并保存至本地。爬虫开发的核心在于模拟浏览器请求、解析网页结构以及处理网络传输。在编写代码前,我们需要分析目标网站的请求机制,确保能够稳定获取数据。
开发环境与依赖
环境要求
- Python 版本:3.8 及以上
- 操作系统:Windows / macOS / Linux
安装依赖
虽然本示例主要使用标准库 urllib,但建议安装 requests 库以增强功能(如需)。
pip install requests
目标网站分析
- 打开目标页面:在浏览器中访问网易云音乐飙升榜页面。
- 开发者工具:按 F12 打开开发者工具,切换到 Network(网络)标签页。
- 定位数据接口:刷新页面,查找包含 JSON 数据的 XHR/Fetch 请求,或者直接查看 HTML 源码中的静态资源链接。
- 提取关键信息:通过正则表达式或 DOM 解析提取歌曲 ID、名称及下载地址。
注意:部分音乐文件可能需要特定的 Cookie 或 Referer 验证,实际生产中需根据反爬策略调整请求头。
核心代码实现
以下代码演示了如何获取榜单列表、解析歌曲信息并批量下载 MP3 文件。
import os
import re
from urllib.request import Request, urlopen
# 配置文件夹路径
folder = r'.\music'
if not os.path.exists(folder):
os.makedirs(folder)
# 目标 URL
url = 'https://music.163.com/discover/toplist?id=3779629'
# 模拟浏览器请求头
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.190 Safari/537.36',
'Referer': 'https://music.163.com/'
}
try:
# 发送请求获取网页源码
req = Request(url, headers=headers)
with urlopen(req, timeout=10) as fp:
content = fp.read().decode()
pattern =
matches = re.findall(pattern, content)
music_id, music_name matches:
safe_name = re.sub(, , music_name)
music_file = os.path.join(folder, )
os.path.exists(music_file):
()
download_url =
:
req_download = Request(download_url, headers=headers)
urlopen(req_download, timeout=) fp:
data = fp.read()
(music_file, ) out_fp:
out_fp.write(data)
()
Exception e:
()
Exception e:
()


