本专栏主要分享Python爬虫工程师在技术进阶过程中必须掌握的各种反反爬技能。期待和Python爬虫爱好者共同探讨。

前言:

网页的js加密是爬虫过程中经常会遇到的反爬措施,导致在开发爬虫脚本时,无法正确构造请求头、表单等信息。

通过本案例,希望带给你破解js加密的常规流程和解密思路。

注意:

或许你是个Python高手,但是没有前端js的经验,我可以确定的是,这丝毫不会影响你学习本文的js破解,另外,对于js的学习,最好的方式,就是直接开始硬怼js,闭着眼睛硬干,多干它几个网站,你就基本掌握了常见的js相关知识。毕竟计算机语言只是写法、功能上的差异,基本的逻辑都是相通的。

开始破解

目标网站:谷歌学术镜像搜索http://ac.scmor.com/

环境:win10,Python3.6,pycharm

目的:提取网页上‘现在访问’字样所对应的url。如下

python 爬虫 jsp动作元素 javascript python 爬虫_python 爬虫 jsp动作元素

首先,我们请求首页链接(http://ac.scmor.com/) ,发现response中并没有我们所要的链接,于是猜测是在点击的一瞬间生成的对应链接。

在首页打开开发者工具,点击选择元素,放到“现在访问”字样上面,发现源码中是一个a标签下的onclick事件。(不懂js的同学也没有关系,从现在开始,你至少懂得这一个js知识了)

python 爬虫 jsp动作元素 javascript python 爬虫_js破解_02

 

值得注意的是,这个onclick中,带着一个visit函数,那么,我们点击搜索,直接找这个visit函数在哪个js中。如图进行搜索

python 爬虫 jsp动作元素 javascript python 爬虫_搜索_03

 

 

刚好只有一段js文件里有这个visit函数,那么双击下面搜索到的代码,就能看到,跳转到了source下对应的js文件。如图:

python 爬虫 jsp动作元素 javascript python 爬虫_python 爬虫 jsp动作元素_04

 

可以点击图中的格式化按钮,把js进行格式化,有助于人眼查看。在搜索栏里搜索visit,可以看到visit里面对应的参数是autourl[b],而对visit的定义,从源码可以看出:先打开一个网页,在Gword不为空时,url = strdecode(url),同时把url赋值到这个按钮下

python 爬虫 jsp动作元素 javascript python 爬虫_python 爬虫 jsp动作元素_05

 

这里关系到一个Gword 值,一个是strdecode函数。下面继续找decode函数,可以看到该函数的定义如下:

python 爬虫 jsp动作元素 javascript python 爬虫_js破解_06

这里第一行:是把string进行函数base64decode()。

第二行:生成一个key。

第三行:计算len值。

紧接着在for循环中计算得到code,最后返回的是进行base64decode后的code 。其中,fromCharCode() 可接受一个指定的 Unicode 值,然后返回一个字符串(类似Python中的chr()函数)。charCodeAt() 方法可返回指定位置的字符的 Unicode 编码(类似Python中的ord()函数)。不懂的函数都可以百度深入理解。

这个函数中此时只剩下base64decode()没有找到,继续找吧。

搜索发现生成函数的位置:

python 爬虫 jsp动作元素 javascript python 爬虫_js破解_07

发现函数体较大,最后是把参数return回来,我们直接把函数copy过来放到本地scmor.js中,放到Python中用execjs库调用node去计算这个函数即可。同时这个函数中有个参数base64DecodeChars,搜索发现这是个常量Array,可以在js中直接复制过来即可。

至于在py脚本中对于js文件的调用方法:首先读取js文件

with open('scmor.js', 'r', encoding='utf-8') as f:
    js1 = f.read()
    ctx = execjs.compile(js1)

然后调用这个js中的函数,带上参数string即可。写法如下:

string = ctx.call('base64decode',string)

另外,Gword值,从源码中可以看到,是个常量:

python 爬虫 jsp动作元素 javascript python 爬虫_Python破解_08

最后代码运行可以得到所需链接,结果如下:

python 爬虫 jsp动作元素 javascript python 爬虫_Python破解_09

 

20190316最新破解。