? 优质资源分享 ?
学习路线指引(点击解锁) | 知识定位 | 人群定位 |
---|---|---|
? Python实战微信订餐小程序 ? | 进阶级 | 本课程是python flask+微信小程序的完美结合,从项目搭建到腾讯云部署上线,打造一个全栈订餐系统。 |
?Python量化交易实战? | 入门级 | 手把手带你打造一个易扩展、更安全、效率更高的量化交易系统 |
Python爬虫之JS逆向采集某易云音乐网站
在获取音乐的详情信息时,遇到请求参数全为加密的情况,现解解决方案整理如下:
JS逆向有两种思路:
一种是整理出js文件在Python中直接使用execjs调用js文件(可见我的另一篇文章《 python爬虫之企某科技JS逆向》)。
一种是根据JS中的逻辑,使用Python重写相应的方法。(可见另一篇文章《爬虫之JS逆向》)
本文介绍的也是第一种思路,即从目标网站中提取JS文件,然后由Python中使用execjs调用,得到我们想要的数据。
需求:爬取音乐网站中的飙升榜数据https://music.163.com/#/discover/toplist
遇到的问题:在请求单条音乐详情时遇到请求参数均是加密的情况。
第一步:获取列表数据,此条没什么限制,跳过。
GET请求https://music.163.com/discover/toplist,即可获取到页面信息,从页面中提取信息即可。
第二步:单条音乐播放时,网站发送了请求,在请求回调中返回了音乐文件的地址。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-2z747Io8-1654967723432)(https://img2022.cnblogs.com/blog/505712/202206/505712-20220611213511251-1212893374.png "UntitledImage.png")]
切换到载荷页签,可以看到params和encSecKey两个参数均是加密状态的数据。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-SxCLWi8C-1654967723435)(https://img2022.cnblogs.com/blog/505712/202206/505712-20220611213605308-864524571.png "UntitledImage.png")]
根据关键词encSecKey来搜索一下脚本文件。通过ctrl+f再次搜索定位到这一行,params和encSecKey两个参数最终的位置定位到了。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-YAEiGbd9-1654967723436)(https://img2022.cnblogs.com/blog/505712/202206/505712-20220611213752089-1568307086.png "UntitledImage.png")]
具体代码为:
var bKB3x = window.asrsea(JSON.stringify(i6c), buV0x(["流泪", "强"]), buV0x(Rg2x.md), buV0x(["爱心", "女孩", "惊恐", "大笑"]));
e6c.data = j6d.cr7k({
params: bKB3x.encText,
encSecKey: bKB3x.encSecKey
})
也就是说我们需要的params和encSecKey是由window.asrsea方法生成,此方法有四个参数,多次调试发现第一个参数与音乐属性相关,后三个参数均为固定的字符串。
在控制台输入window.asrsea敲击回车,查看方法定义,点击一下即可定位到脚本中实际的位置。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-oLNL1cK2-1654967723437)(https://img2022.cnblogs.com/blog/505712/202206/505712-20220611214142535-147969556.png "UntitledImage.png")]
根据方法中的相互引用关系,将JS脚本中相应代码复制到一个JS文件中。
然后根据最终返回的需要,我们再定义一个方法来实现。
function get\_params() {
let d1 = {
"ids": "[1945262840]",
"level": "standard",
"encodeType": "aac",
"csrf\_token": ""
},
d2 = buV0x(["流泪", "强"]),
d3 = buV0x(Rg2x.md),
d4 = buV0x(["爱心", "女孩", "惊恐", "大笑"]);
let res = asrsea(JSON.stringify(d1), d2, d3, d4);
return j6d.cr7k({
params: res.encText,
encSecKey: res.encSecKey,
});
}
此处定义的get_parmas中音乐ID写死了的,这个后续可以改成动态的即可。
至此,这个音乐网站的JS逆向算是搞完了。下面来看一下效果。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-xEbzFCc6-1654967723439)(https://img2022.cnblogs.com/blog/505712/202206/505712-20220611215111487-135827147.png "UntitledImage.png")]
转载请注明:xuhss » python爬虫之JS逆向某易云音乐