还在用网易云音乐客户端?out了~

还在用网易云音乐客户端?out了~

前言

网易云音乐随着互联网时代的来临,优秀的以“大数据”而闻名。自2016年以后,越来越多人接受了这款优秀的音乐网站 or app,因良好的用户体验感而出名,比如歌单这个功能,只有你想不到的,没有用户共享、上传歌单做不到的!什么张雨生合集呀,什么动漫名曲。。。等

对于歌单这项功能来说,应该是许多网易云用户最喜爱的功能之一,毕竟整合了许多符合自己口味的歌曲在一起,省时又省力。但也同时面临着一个问题,即下载!

假如你的电脑上装了网易云音乐的客户端,那么还好说,比如下面这样,你可以一键下载:

在这里插入图片描述

当然,也不排除有些朋友不喜欢这么麻烦,还要装个客户端。。。比如我,能不装电脑上的软件,绝对不会装!所以浏览器听歌成了首选,局限性就是如果没有网,那么浏览器这条路就走不通了!

所以今天,咱们就用爬虫的方式来实现一下,如何用 Python 下载歌单下的所有歌曲!顺便了解下爬虫下载音乐的原理机制。也许下载网易云音乐的文章满大街都是,但具体实现思路,笔者觉得应该一人一个样,不妨耐心的看下去,说不好有意外收获!

PS:本文目的是抱以学习心态而分享,禁止用于非法以及商业途径,如有风险,一切后果自己承担!

成果演示

依然是先看成果,有了成果,才能勾起你的兴趣,看了成果还提不起兴趣的,那确实就是没兴趣了,也不用在往下看了!走着客官,上图~

在这里插入图片描述

爬取以及设计思路

1. 找下载歌曲的外链(对外链接,简称外链)地址

既然主要功能是下载,那么肯定是需要找到对应下载音乐的地址的,如果单从网易云主页分析,还要破解 js 加密什么的,实在麻烦,不妨换一种思路!多多利用搜索引擎,经查询,发现网易云提供了一个对外下载歌曲的地址,只需要知道歌曲id,即可使用地址加id形式打开网页进行播放,地址如下:

# 只需要将歌曲 id 传给此网页,直接打开即可播放!
http://music.163.com/song/media/outer/url?id=xxxxx.mp3

来试试,"金鱼邓紫棋"的这首歌,翻唱龙卷风,id=28427775:

在这里插入图片描述

把id替换到上面给出的外链中,打开后,网址自动跳转,将url加密了,同时自动播放:

在这里插入图片描述

2. 分析歌单下各歌曲关键信息

有了下载地址后一切都变得简单了,只需要做的是,获取你喜爱的歌单地址,然后将此歌单下所有歌曲id进行爬取!还记得爬取的步骤吗?

首先要明确自己想要的信息,而笔者这里想要的信息就三个:歌单名称、歌曲名称、歌曲id。

那么接下来就对网页分析下相应的节点。

歌单名称,看不清楚手机可以点开放大看,以下图片均可:

在这里插入图片描述

歌曲名称:

在这里插入图片描述

歌曲id:

在这里插入图片描述

3. 爬取歌单下所有歌曲的id,同时传入外链地址,进行下载

有了以上分析后,只需要验证下,我们用 Python 模拟请求,访问此网页时,返回的信息与我们F12分析后的结果是否一致。是否真的存在F12看到的信息节点呢?

网页地址:

在这里插入图片描述

此处使用 requests 库模拟发送请求,得到返回的数据,代码是这样的:

import requests
headers = {
            'user-agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko)\
            Chrome/69.0.3497.100 Safari/537.36'
        }
url = "https://music.163.com/#/playlist?id=2722916074"
r = requests.get(url=url,headers=headers)
print(r.text)

用上面这段代码,你请求后返回的内容,会惊奇的发现,怎么找也找不到与F12看到的相似节点内容!为什么呢?猜测是因为网易云做了一层地址上的反爬机制,隐藏了真正的歌单网页。

打开F12,再来找下请求:

在这里插入图片描述

经查找,确实隐藏了真实地址,现在浏览器上看到的 url 多了一个#,所以当我们请求图中 3 的地址时,便是返回的与F12看到的节点信息一致。

思考与动手

本篇文章,大致的思路已经带大家梳理清楚了,接下来就是动手了!笔者本次不打算将自己写的代码放出来,大家对学习爬虫感兴趣的,不妨自己动手写下程序试试。

思路有了,剩下的就是编程实战了!算是给大家留个小作业,有时间有兴趣的,可以评论区留言提问。写完的同学,可以自己动手验证下,是否能将音乐下载到本地,此次案例是一个不错的练手小项目!

下一期,笔者会写一篇讲解自己是如何设计代码的,顺便在把代码开源出来,敬请期待!

PS:文章首发公众号哟,感兴趣的欢迎关注:migezatan.(咪哥杂谈)

### 关于网易云音乐 API 的调用与使用 #### Maven 依赖引入 为了方便开发人员快速集成网易云音乐的功能,可以通过引入特定的 Maven 依赖来简化操作流程。开发者可以将以下依赖项加入到项目的 `pom.xml` 文件中以支持相关功能[^1]。 ```xml <dependency> <groupId>com.example</groupId> <artifactId>netease-cloud-music-api</artifactId> <version>1.0.0</version> </dependency> ``` #### 接口调用基础 通过 HTTP 请求的方式可以直接访问网易云音乐提供的公开接口。例如,搜索歌曲时可采用如下 URL 构造方式: - **URL**: ``` http://music.163.com/api/search/get/web?csrf_token=&s={关键词}&type=1&offset=0&total=true&limit=2 ``` 其中参数解释如下: - `{关键词}` 替换为实际要查询的内容。 - `type=1` 表示搜索类型为单曲(其他类型如专辑、歌手等需调整此值)。 - `offset` 和 `limit` 控制分页逻辑,分别表示偏移量和返回数量[^2]。 #### Cookie 配置 部分高级功能可能需要用户身份验证才能正常使用。此时建议先完成登录过程并保存相应的 cookie 数据,在后续请求头中携带这些认证信息即可实现授权访问。具体做法参见官方推荐或者第三方封装库中的实践案例。 另外还有一种更简便的方法就是模仿移动端应用发送带有所需 app 版本号作为 session id 的 cookies 给服务器端处理请求: ```bash curl -b "appver=8.0.79;" "https://music.163.com/weapi/v3/song/detail" ``` 这里 `-b` 参数后面紧跟的就是模拟出来的客户端版本字符串形式的一个简单的会话标识符样例[^3]。 #### Java 实现示例 下面给出一段基于上述理论知识编写而成的具体代码片段用于演示如何利用此类技术构建跨平台应用程序的一部分功能模块——即从网络上抓取指定关键字对应的若干条匹配记录列表出来供进一步加工展示之用。 ```java import com.alibaba.fastjson.JSON; import org.apache.http.client.methods.CloseableHttpResponse; import org.apache.http.client.methods.HttpGet; import org.apache.http.impl.client.CloseableHttpClient; import org.apache.http.impl.client.HttpClients; public class NeteaseCloudMusicSearch { public static void main(String[] args) throws Exception{ String keyword = "周杰伦"; // 设置你要查找的关键字 CloseableHttpClient httpClient = HttpClients.createDefault(); try{ StringBuilder urlBuilder = new StringBuilder("http://music.163.com/api/search/get/web?"); urlBuilder.append("csrf_token=").append("&"); urlBuilder.append("s=").append(keyword).append("&"); urlBuilder.append("type=1").append("&"); urlBuilder.append("offset=0").append("&"); urlBuilder.append("total=true").append("&"); urlBuilder.append("limit=5"); HttpGet request = new HttpGet(urlBuilder.toString()); CloseableHttpResponse response = httpClient.execute(request); if(response.getStatusLine().getStatusCode() == 200){ System.out.println(JSON.parseObject(EntityUtils.toString(response.getEntity())).toString(4)); } }finally{ httpClient.close(); } } } ``` 以上程序展示了怎样创建一个基本的 GET 请求去检索有关某位艺术家的信息,并打印结果以便观察其结构特点。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值