Glidedsky 爬虫挑战 | js 加密1_javaGlidedsky 爬虫挑战 | js 加密1_java_02



前言

Glidedsky 是一个爬虫闯关的网站,针对不同的水平的玩家,有着难度不同的关卡,基础爬虫,以及比较难的爬虫,用于练练手是挺适合的一个网站

Glidedsky 爬虫挑战 | js 加密1_java_03


这次呢,小编选取了其中的 “js加密1”这一关来带大家操作一下


题目与爬取网址

Glidedsky 爬虫挑战 | js 加密1_java_04Glidedsky 爬虫挑战 | js 加密1_java_05


参考代码获取


关注公众号“木下学Python”,回复关键词“js加密1”获取


分析数据获取位置

先往下翻几页,看能不能找到对应了的数据,这里翻了两页后,发现数据是 XHR 标签栏里请求的,Preview 选项卡点开可看到此页的数据,到这里数据从哪里提取就找到了

Glidedsky 爬虫挑战 | js 加密1_java_06


分析请求

第二页的请求 url 及所带的请求参数如下

Glidedsky 爬虫挑战 | js 加密1_java_07Glidedsky 爬虫挑战 | js 加密1_java_08


第三页的请求 url 及请求参数如下

Glidedsky 爬虫挑战 | js 加密1_java_09Glidedsky 爬虫挑战 | js 加密1_java_10


对比这两页的请求 url 可以看到有三个参数是变化的,page,t,sign,而且每次都不一样,所以想要获取数据,那请求得带上它们才行,page 好理解就是页数,下面看 t,sign 怎么获取的


分析加密参数获取位置


通过打断点的方法来查看请求参数是怎么生成的,切换到 Sources 标签,在 XHR/fetch Breakpoints 这里点加号添加要打断点的 url,这里是请求数据的 url:

www.glidedsky.com/api/level/web/crawler-javascript-obfuscation-1/items

Glidedsky 爬虫挑战 | js 加密1_java_11

然后设置好打断点的 url 后,刷新网页,会看到页面呈灰色,最右边那一栏会有一些东西出现

其中的 call stack 是我们需要用来找生成参数的东西,它是一个显示调用堆栈的东西,从上往下的堆栈调用是离此断点由近到远的调用

Glidedsky 爬虫挑战 | js 加密1_java_12

我们需要从 call stack 从上往下慢慢找哪里像是参数生成的地方,这里到第四个堆栈就可以看到此处是生成参数的地方

Glidedsky 爬虫挑战 | js 加密1_java_13

到这里看到这几行 js 代码就知道这里是生成加密参数的地方了


加密参数获取

t 参数:

Glidedsky 爬虫挑战 | js 加密1_java_14

Math.floor() 

为计算结果取整


$('main .container').attr('t')

从 html 源代码页面中的 class 为 container 的标签中获取 t 的值,这里的 html 是爬取的此页的 url,不是请求获取数据的那个 url


获得后再做运算就是所需的参数 t

Glidedsky 爬虫挑战 | js 加密1_java_15Glidedsky 爬虫挑战 | js 加密1_java_16



sign 参数:

Glidedsky 爬虫挑战 | js 加密1_java_17

把鼠标放在调用的函数上可以看到调用的函数,点进去可以看到用算法生成的过程

Glidedsky 爬虫挑战 | js 加密1_java_18

正常情况下可以单独把调用的函数的 js 代码扣下来用,但此处这样做是用不了,因为这代码对方只是想让你看,不想让你复制粘贴就可用,所以直接扣是不行的

但从它调用的函数名可以看出是用了 sha1 算法加密生成的,所以我们可以用 js 写sha1 算法或 python 写 sha1 算法来生成我们的参数

Glidedsky 爬虫挑战 | js 加密1_java_19


Final

Glidedsky 爬虫挑战 | js 加密1_java_20


知道请求所需的加密参数怎么获取以后,就可以编写爬虫爬取 1000 页的数据了