现在很多歌曲都要付费才能下载或播放,确实是很难受。对于爬虫工程师来说更是叔叔能忍,婶婶不能忍!!!
笔者无意间发现了一个免费的音乐网站,歌曲质量很高而且还是免费,感兴趣的同学可以自行收藏一下。
aHR0cDovL3Rvb2xzLmxpdW1pbmd5ZS5jbi9tdXNpYy8/cGFnZT1zZWFyY2hQYWdl
这个网站虽然说下载免费,但是我们想批量下载还要一个一个慢慢点,很麻烦。于是我默默的打开F12
随便以一首歌为例,点击搜索,如下图:
发现成功找到服务器返回的信息,再剩下的内容就是用爬虫去批量下载歌曲就大功告成了,简直完美。
进一步分析发现post请求中的data参数进行了加密。接下来又到了熟悉的逆向环节。
加密分析
搜索返回的数据包是xhr,source面板下添加一个xhr断点
继续点击下一页,发现果然断下来了。接下来在堆栈中寻找加密的地方就OK了。
加密的地方还是比较简单的,可以看到使用encode函数进行加密,函数的参数是字符串的拼接
其中b、d,searchType这三个值通过js获取
b是搜索的关键字,searchType是搜索的类型,d是页数初始值为1,不断进行翻页累加。
到这里就已经清楚逻辑了,接下来把代码扣下来然后使用python编写代码请求就没有问题了。
抠代码
打上断点,跟进encode函数中
把整个encode函数拿出来放在本地进行调试
提示缺少_0x5e84,本着缺啥补啥的原则,把_0x5e84找到拿到本地
提示缺少_0x2494,继续把_0x2494找到扣下来。
提示location没有定义,定义一个就好了。
又继续报错,肯定是环境没有补好,
回到网页中找到该行看看是哪有出了问题
在location对象中补上这两个属性就不会报错了
window = global;
window.location = {
host: "tools.liumingye.cn",
protocol: "http:"
};
如果嫌补环境麻烦,可以直接copy location,多补总是不会错的
window = global;
window.location ={
"ancestorOrigins": {},
"href": "http://tools.liumingye.cn/music/?page=audioPage&type=migu&name=%E7%88%B1%E4%BD%A0",
"origin": "http://tools.liumingye.cn",
"protocol": "http:",
"host": "tools.liumingye.cn",
"hostname": "tools.liumingye.cn",
"port": "",
"pathname": "/music/",
"search": "?page=audioPage&type=migu&name=%E7%88%B1%E4%BD%A0",
"hash": ""
}
继续调试发现还是报错
md5没有定义,接着把md5扣出来就可以了。
大功告成!
接下来使用python请求,测试能否得到结果
这里就顺利的得到了结果,打开浏览器也是可以播放的
至此,整个分析就结束了。
本文仅供学习使用,切勿非法使用,如有侵权请联系作者及时删除!