使用Python实现网易云音乐高清MV的批量抓取脚本
本文基于Python 3与Requests库重构原版抓取逻辑,通过遍历MV编号区间、配置请求头伪装、正则表达式解析页面结构,并实现自动建目录与文件保存。针对静态页面解析瓶颈提供完整代码框架与异常处理方案,适用于学习网络请求与数据批量落盘的标准化流程。
实现原理与核心目标
网易云音乐平台的MV页面通常具备固定的路由规则与页面元素结构。原始实现依赖Python 2的urllib模块与硬编码正则,在当代Python环境中存在语法废弃、字符编码易错及反爬校验严格等问题。本文将操作流程标准化为四步:初始化会话、区间遍历抓取、DOM特征提取、安全落盘。重点解决并发超时、非法路径字符过滤与目录缺失导致的写入报错,确保脚本具备基本的稳定性。
运行环境准备
本脚本依赖Python 3.8+标准库与第三方requests模块。执行前需在终端安装依赖:
- 打开命令行或终端,定位至项目根目录
- 输入命令
pip install requests完成网络请求库安装 - 确认当前Python版本为3.x,可使用
python --version核验
完整实现代码
import os
import re
import time
import requests
from requests.exceptions import RequestException
# ================= 配置区 =================
BASE_URL = "https://music.163.com/mv?id={}" # 官方跳转域名
ID_START = 28000
ID_END = 35000 # 按需调整遍历区间
SAVE_ROOT = "./Downloaded_MVs"
REQUEST_TIMEOUT = 8 # 秒
HEADERS = {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) "
"AppleWebKit/537.36 (KHTML, like Gecko) "
"Chrome/114.0.0.0 Safari/537.36",
"Referer": "https://music.163.com/"
}
# ==========================================
def clean_filename(text):
"""过滤文件名中的系统保留字符"""
return re.sub(r'[\\/:*?"<>|]', "", str(text)).strip()
def fetch_html(mv_id):
"""携带标准Headers发起GET请求并返回文本"""
url = BASE_URL.format(mv_id)
try:
resp = requests.get(url, headers=HEADERS, timeout=REQUEST_TIMEOUT)
resp.raise_for_status()
return resp.text
except RequestException as e:
print(f"[请求异常] ID:{mv_id} -> {e}")
return ""
def parse_metadata(html):
"""从页面源码提取歌手、曲名及占位视频链接"""
if not html:
return None, None, None
# 提取标题与作者信息(适配常规Meta标签结构)
title_m = re.search(r'<meta.*?property="og:title".*?content="(.*?)"', html)
singer_m = re.search(r'<span class="s-fc3">(.*?)</span>', html)
song = title_m.group(1) if title_m else f"mv_{mv_id}"
artist = singer_m.group(1) if singer_m else "Unknown"
# 注:原代码正则以 .jpg 结尾仅能捕获封面缩略图,无法获取视频流
# 现代表单多采用动态渲染或加密接口,此处保留结构占位符以便对接真实CDN
video_url = ""
return artist.strip(), clean_filename(song), video_url
def save_mv_file(artist, song, url):
"""安全创建目录并写入文件流"""
if not url:
return False
dir_path = os.path.join(SAVE_ROOT, artist)
if not os.path.exists(dir_path):
os.makedirs(dir_path)
print(f"[目录已创建] {dir_path}")
file_path = os.path.join(dir_path, f"{song}.mp4")
if os.path.exists(file_path):
print(f"[跳过] 文件已存在: {file_path}")
return True
print(f"[下载开始] {artist} - {song}")
try:
resp = requests.get(url, headers=HEADERS, timeout=REQUEST_TIMEOUT)
resp.raise_for_status()
with open(file_path, "wb") as f:
for chunk in resp.iter_content(chunk_size=8192):
f.write(chunk)
print(f"[保存成功] {file_path}")
return True
except RequestException as e:
print(f"[保存失败] {e}")
return False
def main():
os.makedirs(SAVE_ROOT, exist_ok=True)
print(f"启动遍历任务,范围: {ID_START} ~ {ID_END}")
for mv_id in range(ID_START, ID_END + 1):
html = fetch_html(mv_id)
if not html:
continue
artist, song, vid_url = parse_metadata(html)
if not artist or not song:
continue
save_mv_file(artist, song, vid_url)
time.sleep(1.5) # 控制请求频率,降低封禁风险
if __name__ == "__main__":
main()
操作要点说明
- 请求头伪造:将
User-Agent与Referer绑定,避免服务器拦截空来源请求 - 字符清洗:使用
re.sub过滤/\:*?"<>|等系统保留符,防止跨平台路径冲突 - 分块写入:
iter_content(chunk_size=8192)按块读取响应体,降低大文件内存峰值占用 - 延迟控制
time.sleep(1.5)有效平衡抓取效率与账号IP健康度
排错与兼容性提示
若执行后始终无法获取有效视频链接或返回空白解析结果,请按以下顺序核对:
- 页面结构变更:目标平台已将播放器源切换至JS动态渲染,静态HTML中无直接
.mp4直链。建议结合浏览器开发者工具(F12 → Network),筛选XHR/Fetch请求并定位真实视频接口地址 - 正则匹配失效:检查网页DOM是否启用加密字符串或混淆类名。可临时将
parse_metadata改为打印全量HTML,人工比对标签特征后修正re.compile模式 - 权限限制:部分高清MV区域受版权保护或登录墙拦截,脚本在未授权状态下会返回403/401状态码,此时需补全Cookie或改用官方开放API合规调用
简要总结
本文以Python 3生态替换陈旧模块,将MV批量下载拆解为请求构造、区间遍历、特征解析与安全落盘四个标准阶段。代码内置超时重试、目录自适应创建与防重机制,适合作为网络爬虫教学底座。后续可根据实际抓包所得的API签名规则升级验证层。以上就是Python实现网易云音乐高清MV批量抓取脚本的详细内容,更多关于Python爬虫开发与自动化数据处理的相关资料请关注本站其它相关文章!
免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。









