某音乐网站的歌单采集过程,纯技术分享,千万别乱用

630 阅读4分钟

本文首发于公众号 极客枫哥 ,日更分享各种好玩的软件、编程知识和个人成长故事

大家好啊,我是枫哥。最近有个朋友找我帮忙采集一个 xx 音乐的网站歌单信息,这篇文章记录了一下实现的思路和具体的过程。如果你想要源码的话,也可以加文末微信获取。

要采集的页面大概长这样,要采集的就是这个列表的数据,歌曲名称、歌手、播放链接,时长四个字段。

按照国际惯例,我们先打开浏览器的开发者工具看一眼请求的情况。这里有个小技巧,我们可以把历史请求记录先清空,然后点击下一页,看看新的请求。然后就顺利找到了下面的请求

第一次尝试

看一下请求参数的内容,很明显 pn表示第几页,rn表示每页的条数。

那我要是把 rn改成 9999 这种很大的数字,不就一次性可以拿到所有数据了吗?

直接 Copy as fetch复制这个请求

然后贴到控制台里,修改 rn的数值

嗯...不出意外的话,就要出意外了,收到了这样一条友好的提示

继续分析

那如果我把 pn改成 3呢?是不是就能拿到第 3页的数据了

果然,又失败了

观察一下第二页和第三页的请求参数

不难发现,这个 reqId很是显眼,于是全局搜索接口名称 album/albumInfo定位到了发出请求的位置和代码如下

但是从请求参数中没有看到 reqId,说明 reqId应该是一个共用参数,大概率是在封装的 request工具函数中统一生成的,于是挂断点根据函数的执行栈继续向上找,就找到了这里

o就是 reqId,也可以看到 o是由 l()() 这个函数产生的。

事情好像有点复杂了,再跟下去的话,可能要去扒底层的加密代码了。但是以我多年的开发经验来看,这种前端加密或者生成密钥相关的算法大概率都是用的开源库,极少数会自己开发的。

果然根据关键字搜索,就让我找到了 reqId是用 node-uuiv1 版本来生成的。

然后立马写个脚本来测试一下看看

嗯,是的,又出意外了。

继续观察参数,这个 headers中的 secret非常亮眼......

继续挂断点,找 secret生成的地方,然后扒函数,补环境,执行,为了保险起见,这里省略一点点细节。

然后就成功得到了 secret生成的函数

拿着新生成的 secret再去请求一把。

嘿嘿,就拿到数据喽。修改页码,再请求,也是能成功拿到数据的,接下来就是体力活了,拿到页码,循环请求,合并数据,生成 excel,过于简单就不写了。

但是一定要注意,循环请求的时候两次请求之间最好加个 sleeprandom生成一个 3s 或 5s 的,别太频繁把服务器搞挂了。

第二种思路

如果我不会 js 逆向,怎么办?我也尝试了另一种思路,利用油猴脚本。先来介绍一下什么是油猴吧,油猴是一款浏览器的插件,允许用户自己编写和运行自定义的脚本来修改网页的行为和样式。

这么理解呢?就相当于在网页本身的代码运行环境外,你可以内嵌一段你自己的脚本。

比如我想在打开百度的网站后就弹一个 1

就可以写这样一段脚本

然后当你打开百度的时候,就会弹窗了

于是顺着这个思路来做的话,具体的步骤就大致是这样的

  1. 解析第一页数据
  2. 模拟人工点击下一页
  3. 解析当前页数据

......

当然过程中也有很多坑,比如频繁点击后会跳到异常页面,这种情况下如何接着上次的开始?数据怎么存?处理好的数据如何保存等等。如果感兴趣可以私信~

贴一个最终执行的示例图

数据保存在 localStorage

采集完成后,会把数组写到一个文件并下载

总结

这篇文章主要记录了采集音乐网站歌曲列表的过程,主要用来提供一下 js逆向和解决问题的技术思路,请勿做违法用途。另外,碰到采集数据的需求时,一定要先看看是否合法。

  1. 采集个人隐私信息
  2. 采集非公开数据
  3. 因为采集导致网站崩溃严重影响运营

这几点都是不合法的哈。

另外通过 js逆向的思路也可以让大家知道这开发网站的时候如何来提高安全性,正所谓:"知己知彼,百战不殆",知道别人是如何破解的,才能找到更好的应对策略。