本专栏主要分享Python爬虫工程师在技术进阶过程中必须掌握的各种反反爬技能。期待和Python爬虫爱好者共同探讨。
前言:
网页的js加密是爬虫过程中经常会遇到的反爬措施,导致在开发爬虫脚本时,无法正确构造请求头、表单等信息。
通过本案例,希望带给你破解js加密的常规流程和解密思路。
注意:
或许你是个Python高手,但是没有前端js的经验,我可以确定的是,这丝毫不会影响你学习本文的js破解,另外,对于js的学习,最好的方式,就是直接开始硬怼js,闭着眼睛硬干,多干它几个网站,你就基本掌握了常见的js相关知识。毕竟计算机语言只是写法、功能上的差异,基本的逻辑都是相通的。
开始破解
目标网站:谷歌学术镜像搜索(http://ac.scmor.com/)
环境:win10,Python3.6,pycharm
目的:提取网页上‘现在访问’字样所对应的url。如下
首先,我们请求首页链接(http://ac.scmor.com/) ,发现response中并没有我们所要的链接,于是猜测是在点击的一瞬间生成的对应链接。
在首页打开开发者工具,点击选择元素,放到“现在访问”字样上面,发现源码中是一个a标签下的onclick事件。(不懂js的同学也没有关系,从现在开始,你至少懂得这一个js知识了)
值得注意的是,这个onclick中,带着一个visit函数,那么,我们点击搜索,直接找这个visit函数在哪个js中。如图进行搜索
刚好只有一段js文件里有这个visit函数,那么双击下面搜索到的代码,就能看到,跳转到了source下对应的js文件。如图:
可以点击图中的格式化按钮,把js进行格式化,有助于人眼查看。在搜索栏里搜索visit,可以看到visit里面对应的参数是autourl[b],而对visit的定义,从源码可以看出:先打开一个网页,在Gword不为空时,url = strdecode(url),同时把url赋值到这个按钮下
这里关系到一个Gword 值,一个是strdecode函数。下面继续找decode函数,可以看到该函数的定义如下:
这里第一行:是把string进行函数base64decode()。
第二行:生成一个key。
第三行:计算len值。
紧接着在for循环中计算得到code,最后返回的是进行base64decode后的code 。其中,fromCharCode() 可接受一个指定的 Unicode 值,然后返回一个字符串(类似Python中的chr()函数)。charCodeAt() 方法可返回指定位置的字符的 Unicode 编码(类似Python中的ord()函数)。不懂的函数都可以百度深入理解。
这个函数中此时只剩下base64decode()没有找到,继续找吧。
搜索发现生成函数的位置:
发现函数体较大,最后是把参数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值,从源码中可以看到,是个常量:
最后代码运行可以得到所需链接,结果如下:
20190316最新破解。