前言
网络爬虫的大障碍,就是各种加密。这其中包过登录的验证码以及加密。js混淆、js参数加密等等。其实以前也就了解过js加密。但是没有深入研究,借着这次实践研究了一下网易云音乐的加密方式。博主通过网易云音乐评论加密的实例来做个学习过程的分析和分享。
如果有问题或者不懂的地方可以关注我的微信公众号(bigsai)
,联系我。
技能点
- 前端:
js
知识(比较重要)、谷歌浏览器debug、抓包、打断点调试
能力(必须)。以及js各种加密函数(了解). - python:基础的请求
requests
。Crypto.Cipher
加密解密模块。 - 其他:postman(模拟请求使用),良好的思维能力和分析能力。(加密算法有些乱),还有一点就是
js加密转python
的代码实现。
界面概况
静态网页
对于一般的url随着页面的变化而变化的页面,网易云还是有的,你只需要抓取网页进行分析即可。
动态网页
但随着前后端分离的流行,以及数据分离好处明显。越来越多的数据采用ajax渲染。而网易云的评论即使如此。 在前后端分离刚火,那时很多网站对借口并没有太大的防护措施。就使得很多网站轻松获取结果。至今也有很多这样的借口存在,这种网站爬去就是傻瓜式爬取。
然而随着前段技术的发展,接口也变的越来越棘手。就拿网易云的评论来说:它的参数就让人很懵逼。 这一串串数字到底是啥。很多人见到这样的数据就会选择放弃。那么让我为你解开它什么的面纱
。
页面解析
step1: 找参数
你可以看的到,它的参数有两个,一个是params
,一个是encSecKey
并且都是经过加密的,我们就要分析它的源头。F12打开source搜索encSckey
.
encSecKey
,发现原来在这里,经过断点调试发现这里就是最终参数的结果。
step2:分析js函数
这个js有4w多行,如何能在4w多行js中找到有用的信息,然后理清楚这里的思路呢?
这就需要你的抽象和逆向思维
了。来,咱么开始分析。
var bYc7V = window.asrsea(JSON.stringify(i3x), bkY2x(["流泪", "强"]), bkY2x(VM8E.md), bkY2x(["爱心", "女孩", "惊恐", "大笑"]));
e3x.data = k4o.cz4D({
params: bYc7V.encText,
encSecKey: bYc7V.encSecKey
})
复制代码
上面这段代码中就是来源,我们先不管这个JSON.stringify(i3x)
这些参数是啥,先搞清楚window.asrsea
是什么。在上面不远处你会发现:
d、e、f、g
四个参数就是我们刚刚说的不要管的参数。 从这个函数就是分析:encText是经过
两次b()
函数,encSecKey是经过
c()
函数,执行的一个参数。注意其中i参数来源是
a(16)
.网上看看这些函数。
function a(a) {
var d, e, b = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789", c = "";
for (d = 0; a > d; d += 1)
e = Math.random() * b.length,
e = Math.floor(e),
c += b.charAt(e);
return c
}
function b(a, b) {
var c = CryptoJS.enc.Utf8.parse(b)
, d = CryptoJS.enc.Utf8.parse("0102030405060708")
, e = CryptoJS.enc.Utf8.parse(a)
, f = CryptoJS.AES.encrypt(e, c, {
iv: d,
mode: CryptoJS.mode.CBC
});
return f.toString()
}
function c(a, b, c) {
var d, e;
return setMaxDigits(131),
d = new RSAKeyPair(b,"",c),
e = encryptedString(d, a)
}
function d(d, e, f, g) {
var h = {}
, i = a(16);
return h.encText = b(d, g),
h.encText = b(h.encText, i),
h.encSecKey = c(i, e, f),
h
}
复制代码
可以发现a(16)
就是一个随机生成的数,所以我们不需要管他。而b目前来看是AES的cbc模式加密。那么这个encText
生成的规则我们就很清楚了。两次AES的cbc加密。其中偏移量为0102030405060708
固定不变。两次的key不同。而函数c就是三个参数进行RSA加密。整个算法大体流程差不多稍微了解。
到这里先停一下
,不要在分析函数了,我们在分析分析数据。
step3:分析参数
再回到var bYc7V = window.asrsea(JSON.stringify(i3x), bkY2x(["流泪", "强"]), bkY2x(VM8E.md), bkY2x(["爱心", "女孩", "惊恐", "大笑"]))
这个函数。凭直觉能够感觉得到有些数据一定跟我们的核心参数
无关,最多跟时间戳有关。
查找bky2x源头,
再找的话其实没必要,这类函数你找找。可以复制到vscode溯源找到根源。分析,在这里就不繁琐介绍。直接打断点分析吧!看看他是怎么执行的。 其实多次抓你会发现后三个参数是固定不变
的(非交互型数据)。 然而最想要的是第一个参数
你心心年年的参数原来长这个样,那么和预想差不多,仅仅第一个参数和我们的参数有关。offset就是
页面*20
,R_SO_4_+songid就是当前这首歌的id.其实到这个时候,你的
i和encSecKey
可以一起保存了。因为上面分析说过,这个
i
是随机生成,而
encSecKey
也和我们核心参数无关,但是和
i
相关,所以要记录一组。用作ESA加密的参数和post请求的参数。
现在的你是不是很激动,因为真想即将浮出水面。
step4: 校验
这步骤也是很重要的一环,因为你在它的js中会发现。
网易是否会动手脚呢?下载原始的js进行测试。发现哈哈,结果一致。那么就不需要更改再仔细查看那段加密算法的代码了。架构图为
step5:转为python代码
需要将AES的cbc模式的代码用Python克隆。达到加密的效果,测试一下。发现结果一致nice
编写爬虫
下面就开始编写爬虫。先用postman
测试需要那些参数。
如果有疑问或者过期可以关注我公众号联系我。