使用nodejs快速实现爬取QQ音乐资源(一个简单的爬虫)
今天给大家分享一个使用nodejs快速实现一个爬虫的一个小小教程
对于此教程建议由node基础的同学观看,所以我不会写太多关于node的使用哈
教程制作的爬虫功能就是爬取QQ音乐的资源哈,功能比较单一所以有点low的那种,见谅
- 首先我们登录QQ音乐的官方网站要登陆不然无法访问API QQ音乐官网 登陆进去哈
- 然后着手新建一个文件夹取名随意吧,然后进入这个文件夹
npm使用npm init
yarn使用yarn init
还有一个pnpm的具体就不知道怎么初始化了 - 初始化好了之后我们需要安装依赖的一些包了,分别是: superagent request
键入命令
npm i superagent request
yarn 或者cnpm等等的自己安装哈
(还是建议大家使用yarn或者pnpm的来安装包,因为更快更方便,用的是yarn哈 附带一个安装方法很简单)
使用这条命令就可以轻松安装yarn或者pnpm等其他的包管理器了
npm i -g yarn
如果你的网速不好又不喜欢使用cnpm(淘宝镜像)请使用
npm config set registry=https://registry.npm.taobao.org
将npm的包仓库更换成淘宝的
-
好了准备工作完成之后就可以着手撸代码了首先我们就用最近非常火的一首歌《一曲相思》来进行演示吧
首先进入QQ音乐官方然后进行搜索《一曲相思》
image.png
然后这首歌就出来了我们可以点击播放按钮就可以听了,好了点击播放吧(哈哈,当然不是听歌哈)
然后我们进入播放界面 CTRL+shift+i 调出开发者工具 或者 f12哈
目前就是这样了
image.png
CTRL+R刷新一下,刷新之后就监听到了许多的请求我们直接过滤media出来,如下

然后直接单击最后一个条目,右键选择第一个 open in new tab
这个

不出意外的话就是这个样子,我们就已经将音乐源文件给它拿到手了,然后你懂得 右键音频另存为就将歌曲下载到本地了,是不是很简单!
。。。。。。。
难道爬虫就完了吗?不没有,我们一个代码还没撸呢怎么可能就这样完了,作为程序员的我们当然是希望计算机帮我们来获取这个歌曲啦,我们只需要提供歌曲名和歌手名就ok了
(上面的获取音乐方法对某些地方还是有点用处的,比如说网易云音乐的API都是进行加密处理的没办法就只能手动撸呗)
-
然后我们可以开始撸代码了,在此之前需要获取一下QQ音乐的API
回到此界面调出开发者工具
image.png
然后刷新一下
image.png
经过我们的苦苦寻找终于找到QQ音乐请求的API (加快速度了)
然后直接上代码了
首先是要使用一个node一个自带的API----readLine进行编写

使用命令行的方式获取歌曲名和歌手名,然后请求对应的信息

其中API url就是上面我们审查出来的一个URL我们直接复制此URL改变w的词就行了

然后我们在浏览器中打开这个API发现我们需要的歌曲信息在data下的song下的list中不多不少刚好10个

然后就是观察我们需要的一些信息-------我们就可以使用如下代码列出歌曲


效果图

在编写代码的过程中发现根本就不需要输入歌手的名字,所以中途修改

-
然后我再进行进一步的处理,回到播放歌曲界面进行刷新
image.png
查看音乐API的参数是怎么来的,查看请求得到此url
image.png
我们右键新界面中打开,看到了许多的m4a的音乐文件不知道是个什么鬼( 猜测应该是浏览器做兼容的)
但是不知道为什么都是m4a,当然,我们也不管它
image.png
然后我们继续查看此url,通过decodeURL我们发现这么一个看不懂的东西

那么呢经过楼主的苦心寻找终于找到了机关所在

这就so easy了这个mid本身就告诉你了,我这里一曲相思的mid是002u0fTY2HoJJp然后就去前面一个歌曲信息API中寻找就行啦,然后音乐的mid就在一个mid属性里面

那我还能说啥直接干吧,继续撸代码
还记的最开始我说过的怎么通过开发者工具找音乐资源吗

我发现每一个音乐资源都有一个固定的前缀加上后面一大坨不认识的url,经过比对我发现

此API刚好有一个属性对齐音乐的资源文件,至于baseURL的话肯定就是

sip的0项啦,哈哈,好了该俺们大显神通的时候到了





最后来一个效果查看




最后想说的就是有什么问题也可以加我的QQ大家一起交流 : 3487492021 ---- 感谢
代码中间有删改,在下最主要分享的还是思考的方法应该怎样去解决这样一个问题,因为自己有些许改动所以最后附上代码源代码,如果对大家有所帮助的话可以给个收藏啊关注啊赞啊什么的,你的支持就是我最大的动力呢!