↑ 关注 + 星标 ~ 有趣的不像个技术号,后台回复【大礼包】送你2TPython自学资料
好消息:Python学习交流群,已经建立,猛戳加入
“阅读本文大概需要 25 分钟。
”在上一节总结一些网站加密和混淆技术中,我们介绍了网页防护技术,包括接口加密和 JavaScript 压缩、加密和混淆。这就引出了一个问题,如果我们碰到了这样的网站,那该怎么去分析和爬取呢?
本节我们就通过一个案例来介绍一下这种网站的分析思路,本节介绍的这个案例网站不仅在 API 接口层有加密,而且前端 JavaScript 也带有压缩和混淆,其前端压缩打包工具是使用了现在流行的 Webpack,混淆工具是使用了 javascript-obfuscator,这二者结合结合起来,前端的代码会变得难以阅读和分析。
如果我们不使用 Selenium 或 Pyppeteer 等工具来模拟浏览器的形式爬取的话,要想直接从接口层面上获取数据,基本上我们就要一点点调试分析 JavaScript 的调用逻辑、堆栈调用关系来整个弄清楚网站加密的实现方法了,我们可以称之为这个过程叫 JavaScript 逆向。这些接口的加密参数往往都是一些加密算法或编码的组合,完全搞明白其中的逻辑之后,我们就能把这个算法用 Python 模拟出来,从而实现接口的请求了。
案例介绍
案例的地址为:https://dynamic6.scrape.cuiqingcai.com/,页面如图所示。
初看之下并没有什么特殊的,但仔细观察可以发现其 Ajax 请求接口和每部电影的 URL 都包含了加密参数。
比如我们点击任意一部电影,观察一下 URL 的变化,如图所示。
这里我们可以看到详情页的 URL 和包含了一个长字符串,看似是一个 Base64 编码的内容。
那么接下来直接看看 Ajax 的请求,我们从列表页的第 1 页到第 10 页依次点一下,观察一下 Ajax 请求是怎样的,如图所示。
可以看到 Ajax 接口的 URL 里面多了一个 token,而且不同的页码这个 token 还是不一样的,这个 token 同样看似是一个 Base64 编码的字符串。
另外更困难的是,这个接口还是有时效性的,如果我们把 Ajax 接口 URL 直接复制下来,短期内是可以访问的,但是过段时间之后就无法访问了,会直接返回 401 状态码。
接下来我们再看下列表页的返回结果,比如我们打开第一个请求,看看第一部电影数据的返回结果,如图所示。
这里我们把看似是第一部电影的返回结果全展开了,但是刚才我们观察到第一步电影的 URL 的链接却为 https://dynamic6.scrape.cuiqingcai.com/detail/ZWYzNCN0ZXVxMGJ0dWEjKC01N3cxcTVvNS0takA5OHh5Z2ltbHlmeHMqLSFpLTAtbWIx,看起来是 Base64 编码,我们解码一下,结果为 ef34#teuq0btua#(-57w1q5o5--j@98xygimlyfxs*-!i-0-mb1
,但是看起来似乎还是毫无规律,这个解码后的结果又是怎么来的呢?返回结果里面也并不包含这个字符串,那这又是怎么构造的呢?
再然后,这仅仅是某一个详情页页面的 URL,其真实数据是通过 Ajax 加载的,那么 Ajax 请求又是怎样的呢,我们再观察下,如图所示。
那么总结下来这个网站就有如下特点:
•列表页的 Ajax 接口参数带有加密的 token•详情页的 URL 带有加密 id•详情页的 Ajax 接口参数带有加密 id 和加密 token
那如果我们要想通过接口的形式来爬取,必须要把这些加密 id 和 token 构造出来才行,而且必须要一步步来,首先我们要构造出列表页 Ajax 接口的 token 参数,然后才能获取每部电影的数据信息,然后根据数据信息构造出加密 id 和 token。
OK,那到现在为止我们就知道了这个网站接口的加密情况了,我们下一步就是去找这个加密实现逻辑了。
由于是网页,所以其加密逻辑一定藏在前端代码里面,但上节课我们也说了,前端为了保护其接口加密逻辑不被轻易分析出来,会采取压缩、混淆的一些方式来加大分析的难度。
好,那么我们 就来看看这个网站的源代码和 JavaScript 文件是怎样的吧。
首先看看网站源代码,我们在网站上点击右键,弹出选项菜单,然后点击「查看源代码」,可以看到结果如图所示。<