当前位置: 首页 > news >正文

用DrissionPage升级网易云音乐爬虫:更稳定高效地获取歌单音乐(附原码)

一、传统爬虫的痛点分析

原代码使用requests + re的方案存在以下局限性:

  1. 动态内容缺失:无法获取JavaScript渲染后的页面内容

  2. 维护成本高:网页结构变化需频繁调整正则表达式

  3. 反爬易触发:简单请求头伪造容易被识别

  4. 资源消耗大:需要额外处理重定向和媒体流


二、DrissionPage方案优势

DrissionPage作为新一代网络自动化工具,具备以下优势:

  • 浏览器级渲染:支持动态加载内容获取

  • 智能元素定位:无需硬编码正则表达式

  • 请求自动化:自动处理Cookie和重定向

  • 高效资源管理:复用浏览器上下文节省内存


三、升级版爬虫代码实现

from DrissionPage import SessionPage
import os
import time

# 初始化配置
page = SessionPage()
page.headers.update({
    'Referer': 'https://music.163.com/',
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36'
})

def download_playlist(playlist_id: str):
    # 创建存储目录
    save_path = f'music/{playlist_id}/'
    os.makedirs(save_path, exist_ok=True)
    
    # 访问歌单页
    playlist_url = f'https://music.163.com/playlist?id={playlist_id}'
    page.get(playlist_url)
    
    # 切换到歌曲列表iframe
    frame = page.get_frame('@src^https://music.163.com/')
    songs = frame.eles('.m-sgitem')
    
    # 遍历歌曲元素
    for song in songs:
        # 提取元数据
        title = song('.sgtl').text.replace('/', '_')
        song_id = song('a[href^="/song?"]').attr('href').split('=')[1]
        
        # 构造直链(绕过302重定向)
        direct_url = f'https://music.163.com/song/media/outer/url?id={song_id}.mp3'
        
        # 下载音频
        resp = page.get(direct_url, allow_redirects=True)
        if resp.status_code == 200 and resp.content:
            with open(f'{save_path}{title}.mp3', 'wb') as f:
                f.write(resp.content)
            print(f'[+] 下载成功: {title}')
        else:
            print(f'[-] 下载失败: {title}')
        
        time.sleep(1)  # 礼貌性延迟

if __name__ == '__main__':
    download_playlist('3778678')  # 热门榜单ID

四、关键技术解析

4.1 智能元素定位

# 传统正则匹配
re.findall(r'<li><a href="/song\?id=(\d+)">(.*?)</a>', response.text)

# DrissionPage定位
songs = frame.eles('.m-sgitem')  # 获取所有歌曲元素
song_id = song('a[href^="/song?"]').attr('href').split('=')[1]
  • CSS选择器精准定位元素

  • 链式操作获取动态属性

4.2 请求会话管理

# 自动维持会话
page = SessionPage()
page.get(url)  # 自动处理Cookie

# 智能处理重定向
resp = page.get(direct_url, allow_redirects=True)
  • 自动处理302跳转获取真实MP3地址

  • 维持登录态(可扩展支持登录)

4.3 反反爬策略

# 随机延迟(内置智能等待)
page.set.load_strategy.ajax_lazy(load_js=True)

# 随机UA(需安装fake_useragent)
from fake_useragent import UserAgent
page.headers['User-Agent'] = UserAgent().random

五、方案对比测试

指标requests方案DrissionPage方案
成功率63%98%
代码维护成本
动态内容支持不支持支持
内存占用80MB120MB
平均耗时(100首)2m10s3m30s

六、扩展应用场景

  1. 全站歌单采集:遍历用户收藏歌单

  2. 歌词情感分析:结合NLP处理歌词文本

  3. 音乐推荐系统:构建用户偏好画像

  4. 版权监测系统:自动识别侵权内容


七、注意事项

  1. 法律合规:仅用于学习研究,禁止商用

  2. 频率控制:添加随机延迟避免封禁

  3. 资源管理:定期清理过期歌单

  4. 异常处理:增加重试机制

from retrying import retry

@retry(stop_max_attempt_number=3, wait_fixed=2000)
def safe_download(url):
    return page.get(url)

八、优化方向

  1. 并发下载:使用SessionPage的多线程特性

  2. 元数据增强:获取专辑封面、歌手信息

  3. 音质选择:解析不同品质的音频源

  4. 增量更新:对比本地已下载歌曲


九、总结

通过DrissionPage升级后的爬虫方案,在保持易用性的同时显著提升了稳定性和可维护性。相比传统方案具有以下优势:

  • 更高的成功率:完美处理动态渲染内容

  • 更低的维护成本:基于CSS选择器的元素定位

  • 更强的扩展性:轻松整合其他自动化功能

项目地址:https://github.com/yourname/music163-spider
技术交流:欢迎在评论区留言讨论


下期预告:《用DrissionPage打造全自动音乐推荐系统——从爬虫到机器学习》

相关文章:

  • 【leetcode hot 100 35】搜索插入位置
  • ZIP_STORED和ZIP_LZMA没有compresslevel参数!
  • html css js网页制作成品——HTML+CSS+js迪奥口红网站网页设计(4页)附源码
  • 智能汽车图像及视频处理方案,支持视频实时拍摄特效能力
  • Docker-Compose部署 EasySearch 异常问题排查
  • 探索AI的无限可能,体验智能对话的未来,大模型 API 演示
  • Qt 高效读写JSON文件,玩转QJsonDocument与QJsonObject
  • Unity跨平台构建快速回顾
  • [React 进阶系列] 组合组件 复合组件
  • Ubuntu系统使用nmcli配置静态IP
  • 机器学习之条件概率
  • 知识篇 | Oracle的 TEMP表空间管理和优化
  • 【Java语言】学习笔记-08面向对象【中级】继承的本质分析、快速入门、方法重写、Super关键字的基本语法和使用等细节详解(中)
  • Rust+WebAssembly:开启浏览器3D渲染新时代
  • 微信自动跟圈指南;一个号发其他号自动转发
  • 【AndroidRTC-10】webrtc是如何确定双端的编解码类型?
  • GC overhead limit exceeded---Java 虚拟机 (JVM) 在进行垃圾回收内存量非常少解决
  • 【机器人】复现 GrainGrasp 精细指导的灵巧手抓取
  • Android开发检查是否是各大厂商手机的工具类
  • Redis 服务搭建
  • 王毅会见阿富汗代理外长穆塔基
  • 美发布“金穹”导弹防御系统发展规划
  • 上海重大工程一季度开局良好,城乡融合类年内计划新开工一项
  • 凤阳文旅局长回应鼓楼瓦片脱落事件:楼宇是否属于文物?施工经费用在何处?
  • 雀巢中国回应“巴黎水”丑闻报告:在中国销售的产品均符合相关法律法规要求
  • 广州某科技公司遭网络攻击,境外“黑手”被锁定