本文首发于公众号 极客枫哥 ,日更分享各种好玩的软件、编程知识和个人成长故事
大家好啊,我是枫哥。最近有个朋友找我帮忙采集一个 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,过于简单就不写了。
但是一定要注意,循环请求的时候两次请求之间最好加个 sleep,random生成一个 3s 或 5s 的,别太频繁把服务器搞挂了。
第二种思路
如果我不会 js 逆向,怎么办?我也尝试了另一种思路,利用油猴脚本。先来介绍一下什么是油猴吧,油猴是一款浏览器的插件,允许用户自己编写和运行自定义的脚本来修改网页的行为和样式。
这么理解呢?就相当于在网页本身的代码运行环境外,你可以内嵌一段你自己的脚本。
比如我想在打开百度的网站后就弹一个 1
就可以写这样一段脚本
然后当你打开百度的时候,就会弹窗了
于是顺着这个思路来做的话,具体的步骤就大致是这样的
- 解析第一页数据
- 模拟人工点击下一页
- 解析当前页数据
......
当然过程中也有很多坑,比如频繁点击后会跳到异常页面,这种情况下如何接着上次的开始?数据怎么存?处理好的数据如何保存等等。如果感兴趣可以私信~
贴一个最终执行的示例图
数据保存在 localStorage
采集完成后,会把数组写到一个文件并下载
总结
这篇文章主要记录了采集音乐网站歌曲列表的过程,主要用来提供一下 js逆向和解决问题的技术思路,请勿做违法用途。另外,碰到采集数据的需求时,一定要先看看是否合法。
- 采集个人隐私信息
- 采集非公开数据
- 因为采集导致网站崩溃严重影响运营
这几点都是不合法的哈。
另外通过 js逆向的思路也可以让大家知道这开发网站的时候如何来提高安全性,正所谓:"知己知彼,百战不殆",知道别人是如何破解的,才能找到更好的应对策略。