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

embedded/2025/3/31 21:01:30/

一、传统爬虫的痛点分析

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

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

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

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

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


二、DrissionPage方案优势

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

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

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

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

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


三、升级版爬虫代码实现

python">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)# 切换到歌曲列表iframeframe = 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 智能元素定位

python"># 传统正则匹配
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 请求会话管理

python"># 自动维持会话
page = SessionPage()
page.get(url)  # 自动处理Cookie# 智能处理重定向
resp = page.get(direct_url, allow_redirects=True)
  • 自动处理302跳转获取真实MP3地址

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

4.3 反反爬策略

python"># 随机延迟(内置智能等待)
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. 异常处理:增加重试机制

python">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打造全自动音乐推荐系统——从爬虫到机器学习》


http://www.ppmy.cn/embedded/176753.html

相关文章

【AI大模型】搭建本地大模型GPT-J:详细步骤及常见问题

GPT-J本地部署&#xff1a;详细步骤指南 我将向您展示如何使用JavaScript/Node.js在本地设置和运行GPT-J模型。这种方法比设置复杂的Python环境更容易访问&#xff0c;并且对Web开发人员来说非常适用。 GPT-J概述 GPT-J是由EleutherAI创建的开源大型语言模型&#xff0c;拥有…

GitHub高级筛选小白使用手册

GitHub高级筛选小白使用手册 GitHub 提供了强大的搜索功能&#xff0c;允许用户通过高级筛选器来精确查找仓库、Issues、Pull Requests、代码等。下面是一些常用的高级筛选用法&#xff0c;帮助你更高效地使用 GitHub 搜索功能。 目录 搜索仓库搜索Issues搜索Pull Requests搜…

DeepSeek高校教程大合集(清华,北大,浙大,夏大,天大,湖大,天大,北师大),持续更新

大家好&#xff0c;我是吾鳴。 自从DeepSeek爆火之后&#xff0c;吾鳴就一直在收集和整理关于DeepSeek的教程报告等资料&#xff0c;也收集了有一个多月了。但是有粉丝朋友反馈说&#xff0c;有点凌乱&#xff0c;细找比较麻烦。于是乎吾鳴基于金山文档建设了一个比较简陋的资源…

eNSP中华为S5700交换机基础配置命令

1. 设备初始化与基础设置 <Huawei> system-view # 从用户视图切换到系统视图&#xff0c;只有在此视图下才能进行全局配置。[Huawei] sysname SW-Core # 修改设备名称为“SW-Core”&#xff0c;便于网络管理时识别设备。[SW-Core] clock timezone UTC8 add 08:00:00…

团体协作项目总结Git

使用Git开放时候发现本地, 有些代码并没有被拉取到本地仓库, 又不想再commit一次, 这时候我就想到了 git commit --amend 合并提交 git commit --amend 修改git提交记录用法详解 可以将本次提交记录合并到上一次合并提交 git commit --amendgit rebase -i master^^ // 假设我…

PostgreSQL:索引与查询优化

&#x1f9d1; 博主简介&#xff1a;CSDN博客专家&#xff0c;历代文学网&#xff08;PC端可以访问&#xff1a;https://literature.sinhy.com/#/?__c1000&#xff0c;移动端可微信小程序搜索“历代文学”&#xff09;总架构师&#xff0c;15年工作经验&#xff0c;精通Java编…

6.milvus搜索search

milvus 版本2.4之后支持多向量搜索&#xff0c;但是我使用的是v2.3.1也是支持多向量搜索的。 两种类型的搜索 单向量搜索&#xff0c;collection中只有一个向量字段&#xff0c;使用search()方法。 多向量搜索&#xff0c;collection中有两个和多个向量字段&#xff0c;使用…

如何在IDEA中借助深度思考模型 QwQ 提高编码效率?

通义灵码上新模型选择功能&#xff0c;不仅引入了 DeepSeek 满血版 V3 和 R1 这两大 “新星”&#xff0c;Qwen2.5-Max 和 QWQ 也强势登场&#xff0c;正式加入通义灵码的 “豪华阵容”。开发者只需在通义灵码智能问答窗口的输入框中&#xff0c;单击模型选择的下拉菜单&#x…