Python 爬虫实战:Request+urllib 模块批量下载飙歌榜音乐文件
前言
本文介绍如何使用 Python 的 urllib 和 requests 相关技术,爬取网易云音乐飙升榜的音频数据并保存至本地。爬虫开发的核心在于模拟浏览器请求、解析网页结构以及处理网络传输。在编写代码前,我们需要分析目标网站的请求机制,确保能够稳定获取数据。
本文介绍使用 Python 的 urllib 模块爬取网易云音乐飙升榜并批量下载音频文件的方法。通过模拟浏览器请求头获取网页源码,利用正则表达式提取歌曲 ID 和名称,进而构造下载链接完成本地存储。文中包含环境配置、网络分析思路及完整代码实现,同时强调了爬虫伦理与反爬策略注意事项。

本文介绍如何使用 Python 的 urllib 和 requests 相关技术,爬取网易云音乐飙升榜的音频数据并保存至本地。爬虫开发的核心在于模拟浏览器请求、解析网页结构以及处理网络传输。在编写代码前,我们需要分析目标网站的请求机制,确保能够稳定获取数据。
虽然本示例主要使用标准库 urllib,但建议安装 requests 库以增强功能(如需)。
pip install requests
注意:部分音乐文件可能需要特定的 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('utf-8')
# 正则匹配歌曲列表
# 注意:实际 HTML 结构可能变化,需根据实际情况调整正则
pattern = r'<li><a href="/song\?id=(.+?)">(.+?)</a></li>'
matches = re.findall(pattern, content)
for music_id, music_name in matches:
# 清理文件名非法字符
safe_name = re.sub(r'[\\/:*?"<>|]', '_', music_name)
music_file = os.path.join(folder, f'{safe_name}.mp3')
if os.path.exists(music_file):
print(f'文件已存在,跳过...{safe_name}')
continue
# 构造下载链接
download_url = f'https://music.163.com/song/media/outer/url?id={music_id}'
try:
# 下载文件
req_download = Request(download_url, headers=headers)
with urlopen(req_download, timeout=10) as fp:
data = fp.read()
with open(music_file, 'wb') as out_fp:
out_fp.write(data)
print(f'下载完成...{safe_name}')
except Exception as e:
print(f'下载失败 {safe_name}: {e}')
except Exception as e:
print(f'请求失败:{e}')
os.path 检查并创建存储文件夹,避免重复创建报错。User-Agent 用于伪装成浏览器,防止被服务器直接拦截;Referer 用于验证来源合法性。re.findall 从 HTML 中提取歌曲 ID 和名称。若网站结构变更,需更新正则表达式。try-except 包裹网络请求和文件写入操作,防止因单个文件错误导致程序中断。对于大规模爬取,单一 IP 容易被封禁。建议使用代理池,并在请求间添加随机延时。
import time
import random
time.sleep(random.uniform(1, 3))
requests 库语法更简洁,支持 Session 保持连接,更适合复杂场景。
import requests
session = requests.Session()
response = session.get(url, headers=headers)
部分网站使用 AJAX 动态加载数据,此时需直接调用 API 接口而非解析 HTML。需在 Network 面板中筛选 XHR 请求获取真实数据源。
robots.txt 协议,确认允许爬取的规则。本文详细讲解了基于 Python urllib 模块进行音乐文件批量下载的实现过程。通过模拟请求、正则解析和文件流处理,完成了从网页到本地的数据迁移。在实际应用中,还需结合反爬策略、异常处理和合规性考量,构建稳健的爬虫系统。

微信公众号「极客日志」,在微信中扫描左侧二维码关注。展示文案:极客日志 zeeklog
解析常见 curl 参数并生成 fetch、axios、PHP curl 或 Python requests 示例代码。 在线工具,curl 转代码在线工具,online
将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online
将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online
将 Markdown(GFM)转为 HTML 片段,浏览器内 marked 解析;与 HTML转Markdown 互为补充。 在线工具,Markdown转HTML在线工具,online
将 HTML 片段转为 GitHub Flavored Markdown,支持标题、列表、链接、代码块与表格等;浏览器内处理,可链接预填。 在线工具,HTML转Markdown在线工具,online
通过删除不必要的空白来缩小和压缩JSON。 在线工具,JSON 压缩在线工具,online