python获取酷wo音乐歌单过程及实现
一 前言
最近研究了一个音乐获取的接口,可以听歌,但是音源参差不齐,有一个宏伟的计划是自己上传音源,但比较费时。
想搞自动化,但还没有思路。音源有了,但没有歌单。由此,拿python实现,并整理成文,分享给大家,同时也加深记忆。
二 分析
打开如下网址:aHR0cDovL3d3dy5rdXdvLmNuL3BsYXlsaXN0cw==
大概长这样:
点开几个,进入详情页。观察URL,除去域名,只有两部分组成:playlist_detail 和 一串数字。
结论:每个歌单的详情URL只改变了最后的一串数字(它就是itemid,后续知道的)
因此,只要找到歌单的这串数字,就可以访问到歌单详情页了
1、寻找歌单的itemid
首先想到的是,直接在歌单列表页,直接F12查看源码,看itemid是否是硬编码在代码中的。
很遗憾,代码中没有全部歌单的itemid
所以,这里使用全局搜索,从歌单详情页的URL字段入手,这里有一个很明显的字段playlist_detail,全局搜索它
有几个搜索结果,这里我们都打上断点,然后点击第一个歌单,程序停留的断点处
我们查看t.item.id的值,发现与详情url的数字相同。
结论:
1、详情url的itemid是在455115ba.js中取得的。
2、点击歌单的文字:会停留在如下代码处:
staticClass: "name",
on: {
click: function(e) {
return t.routeTo("/playlist_detail/".concat(t.item.id))
}
}
3、点击歌单的封面:会停留在如下:(45115ba.js的450行左右,js文件名可能不一样)
staticClass: "cover",
on: {
click: function(e) {
return t.routeTo("/playlist_detail/".concat(t.item.id))
}
}
2、构建完整的歌单url
常规思路:
自动点击歌单,跳转到详情页,直接读取当前页面的地址,就取得了歌单的完整url了。
逻辑没问题,但是当进入详情页后,返回上一个歌单列表页时,永远都会在歌单的第一页上。也就是说,这样的逻辑每次只能抓取一页的歌单,大概25个。
我的思路:
在点击歌单后,不进行跳转,同时取得itemid--也就是歌单URL末尾的一串数字。
三 实现过程
1、js部分
想实现点击不跳转,必须在js中截获点击的函数。
这里我使用抓包工具charles对455115ba.js文件进行直接替换。
先将455115ba.js文件保存到本地,然后修改 点击处跳转 的代码。
如下图:
虽然我们在点击歌单时,可以在js中获取itemid,但是还需要将该值传递给python
因此,这里使用如下办法:
使用js动态创建一个div,并设置id为myDiv
使用该div存放itemid,python通过获取div来得到itemid
如下图:
2、python爬取
爬取过程分为两部分
1 是爬取歌单url以及封面等基本信息
2 是根据1中得到的歌单文件data.json,去爬取每个歌单中的曲目信息,最后生成一个ret.json文件
如下图:
在爬取歌单时,因歌单过多,这里可以选择过滤下。在kuwo.py中编辑过滤的关键字。如下图
目前代码设置读取10页的歌单数据,可以自行修改,如下图:
3、完整代码以及使用说明
1、先使用抓包工具替换修改后的js代码,这里是45115ba.js(2024-11-27实验结果)
2、若kuwo中,没有45115ba.js,请自行按文中方式,找到类似的文件。并在点击封面时,替换如下代码:
// 通过ID获取div元素
var myDiv = document.getElementById("myDiv");
// 判断div元素是否存在
if (!!myDiv) {
// 如果myDiv不是null,表示元素存在
console.log("div元素存在");
myDiv.textContent = ""
// 可以在这里对myDiv进行操作,比如修改其内容等
myDiv.textContent = t.item.id+''//"div元素的内容已被修改";
} else {
// 如果myDiv是null,表示元素不存在
console.log("div元素不存在");
// 可以选择在这里添加一个新的div元素到DOM中
var newDiv = document.createElement("div");
newDiv.id = "myDiv";
newDiv.textContent = t.item.id+''//"这是一个新添加的div元素";
document.body.appendChild(newDiv);
}
3、js文件搞定后,运行kuwo.py文件,得到data.json歌单文件
4、确认data.json文件存在内容,运行kuwo_song.py文件,得到ret.json 即为包含歌曲文件。
demo链接:
https://pan.baidu.com/s/1URLxroXAFqcDIIv5-dz6LQ 密码:2x05