使用Python实现网易云音乐高清MV的批量抓取脚本

陈默
陈默
发布时间:2026-10-12 | 3人浏览过
原创

本文基于Python 3与Requests库重构原版抓取逻辑,通过遍历MV编号区间、配置请求头伪装、正则表达式解析页面结构,并实现自动建目录与文件保存。针对静态页面解析瓶颈提供完整代码框架与异常处理方案,适用于学习网络请求与数据批量落盘的标准化流程。

实现原理与核心目标

网易云音乐平台的MV页面通常具备固定的路由规则与页面元素结构。原始实现依赖Python 2的urllib模块与硬编码正则,在当代Python环境中存在语法废弃、字符编码易错及反爬校验严格等问题。本文将操作流程标准化为四步:初始化会话、区间遍历抓取、DOM特征提取、安全落盘。重点解决并发超时、非法路径字符过滤与目录缺失导致的写入报错,确保脚本具备基本的稳定性。

运行环境准备

本脚本依赖Python 3.8+标准库与第三方requests模块。执行前需在终端安装依赖:

  1. 打开命令行或终端,定位至项目根目录
  2. 输入命令pip install requests完成网络请求库安装
  3. 确认当前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健康度

排错与兼容性提示

若执行后始终无法获取有效视频链接或返回空白解析结果,请按以下顺序核对:

  1. 页面结构变更:目标平台已将播放器源切换至JS动态渲染,静态HTML中无直接.mp4直链。建议结合浏览器开发者工具(F12 → Network),筛选XHR/Fetch请求并定位真实视频接口地址
  2. 正则匹配失效:检查网页DOM是否启用加密字符串或混淆类名。可临时将parse_metadata改为打印全量HTML,人工比对标签特征后修正re.compile模式
  3. 权限限制:部分高清MV区域受版权保护或登录墙拦截,脚本在未授权状态下会返回403/401状态码,此时需补全Cookie或改用官方开放API合规调用

简要总结

本文以Python 3生态替换陈旧模块,将MV批量下载拆解为请求构造、区间遍历、特征解析与安全落盘四个标准阶段。代码内置超时重试、目录自适应创建与防重机制,适合作为网络爬虫教学底座。后续可根据实际抓包所得的API签名规则升级验证层。以上就是Python实现网易云音乐高清MV批量抓取脚本的详细内容,更多关于Python爬虫开发与自动化数据处理的相关资料请关注本站其它相关文章!

相关标签:

本站声明

本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。

Python 相关产品和应用

全部下载

专题列表