117 lines
2.9 KiB
Markdown
117 lines
2.9 KiB
Markdown
---
|
||
title: "「JavaScript」提取(导出)网易云音乐歌单歌曲列表信息为文件"
|
||
date: 2025-03-16T16:11:23Z
|
||
lastmod: 2025-03-16T16:12:07Z
|
||
tags: [代码片段,JavaScript,Web 前端,网易云音乐,信息,导出]
|
||
---
|
||
|
||
# 「JavaScript」提取(导出)网易云音乐歌单歌曲列表信息为文件
|
||
|
||
提取网易云音乐歌单页面中的歌曲列表信息,导出为 JSON 文件。
|
||
|
||
在浏览器的“开发人员工具”的 Console(控制台)中使用。
|
||
|
||
使用前需要登录,否则页面中最多显示 10 首歌曲(登录后最多显示 1000 首歌曲)。
|
||
|
||
用处不大(毕竟有接口可以用,而且获取到的信息更多),只是突然想到就记录下来了。
|
||
|
||
---
|
||
|
||
## 代码
|
||
|
||
#### 提取
|
||
|
||
```javascript
|
||
/**
|
||
* 提取网易云音乐 [歌单页面](https://music.163.com/#/playlist?id=歌单ID) 中的歌曲列表信息
|
||
* 更新:2021-05-03
|
||
*
|
||
* @returns {object[]} 对象数组,对象中包含歌曲 album、artists、duration、id、title 信息
|
||
*/
|
||
function getPlaylistSongInfo() {
|
||
|
||
// 全部歌曲数据
|
||
var songs = [];
|
||
|
||
// iframe
|
||
var frameDoc = document.querySelector("#g_iframe").contentDocument;
|
||
|
||
// 表格行 tr
|
||
var songListTRs = frameDoc.querySelectorAll("#m-playlist .m-table tbody tr");
|
||
|
||
// 遍历
|
||
songListTRs.forEach(function (row) {
|
||
// 表格列 td
|
||
var rowCols = row.querySelectorAll("td");
|
||
// 当前行歌曲信息
|
||
var info = {
|
||
album: rowCols[4].querySelector('.text > a').title,
|
||
artists: rowCols[3].querySelector('.text').title.split('/'),
|
||
duration: rowCols[2].querySelector('span').textContent,
|
||
id: rowCols[0].querySelector('.ply').dataset.resId,
|
||
title: rowCols[1].querySelector('.txt > a b').title
|
||
};
|
||
|
||
songs.push(info);
|
||
});
|
||
|
||
return songs;
|
||
|
||
}
|
||
```
|
||
|
||
#### 转文件
|
||
|
||
```javascript
|
||
/**
|
||
* 字符串转文件
|
||
*
|
||
* @param {string} data 字符串数据
|
||
* @param {string} filename 文件名
|
||
* @param {string} filetype 文件类型(MIME)
|
||
*/
|
||
function strToFile(data = '', filename = 'export.txt', filetype = 'text/plain') {
|
||
|
||
// 转为 Blob
|
||
var strToBlob = new Blob([data], { type: filetype });
|
||
// URL 对象兼容性处理
|
||
var urlObject = window.URL || window.webkitURL || window;
|
||
// 创建对象 URL
|
||
var blobURL = urlObject.createObjectURL(strToBlob);
|
||
// 创建 a 元素
|
||
var aElem = document.createElement('a');
|
||
|
||
// 设置属性
|
||
aElem.classList.add('hidden');
|
||
aElem.download = filename;
|
||
aElem.href = blobURL;
|
||
aElem.target = '_blank';
|
||
|
||
// 添加元素
|
||
document.body.appendChild(aElem);
|
||
|
||
// 模拟点击
|
||
aElem.click();
|
||
|
||
// 移除元素
|
||
aElem.remove();
|
||
|
||
// 释放对象
|
||
urlObject.revokeObjectURL(blobURL);
|
||
|
||
}
|
||
```
|
||
|
||
#### 调用
|
||
|
||
```javascript
|
||
var objData = {
|
||
data: getPlaylistSongInfo()
|
||
};
|
||
var objStr = JSON.stringify(objData);
|
||
|
||
strToFile(objStr, 'export.json', 'application/json');
|
||
```
|
||
|
||
|