图/文:迷神

现在写爬虫也难啊,现在python爬虫写多了,发觉很多大型网站都开始用js 加密技术。记得,有次在利用webQQ登录时需要的某些参数时,从js中获取到的js的加密的函数。如果要转化成对应的Python代码,还是有点难度的。那又没办法直接执行JavaScript代码呢,答案是肯定有的。

为了实现我们自己的Python爬虫的春秋大梦,我们还是要一抗到底,对,突破它。

本次推荐推荐的主角是:PyExecJS

PyExecJS简单安装和实例

python安装PyExecJS很简单pip install PyExecJS

使用实例:

# -*- coding: UTF-8 -*- import execjs #hash33 是javascript函数 encrypt_fun = execjs.compile(""" function hash33(t) { for (var e = 0, i = 0, n = t.length; i < n; i) e = (e << 5) t.charCodeAt(i); return 2147483647 & e } """) print encrypt_fun.call("hash33", "5Kj0l5GEwtMm-VuxuL98Rt*2Qd-UDmNaaQgxtGtZcm9-Umco7PUC8GuQ5nI-3jut") #快速执行js代码,比如: #execjs.eval("1 2 3 4") #>结果:355347598

其实,这个主要利用的就是python可以执行JavaScript,execjs会自动使用当前电脑上的运行时环境(建议用nodejs,与Phantomjs)。现在很多网站都喜欢使用JavaScript生成各种密钥令牌,加密,主要是需要大家举一反三,触类旁通即可。

PyExecJS实战举例

目标地址:ac。scmor。com 自己具体替换接口。

通过执行加密函数的js文件,来抓取活的最终这个上面的所有镜像网址。

最好用的js网络爬虫库(利用Python突破大型网站JavaScript反爬虫加密技术)(1)

目标地址

目标网址里面的地址,都是被加密过的,如图:

最好用的js网络爬虫库(利用Python突破大型网站JavaScript反爬虫加密技术)(2)

加密地址了

通过查看发觉是使用一个叫visit() 的js函数加密了:

最好用的js网络爬虫库(利用Python突破大型网站JavaScript反爬虫加密技术)(3)

加密

2个相关函数如下:

function visit(url) { var newTab = window.open('about:blank'); if(Gword!='') url = strdecode(url); newTab.location.href = url; } #其实这个 Gword,是页面定义的变量:var Gword = "21b5del6oIO57e01a", function strdecode(string) { string = base64decode(string); key = Gword 'ok'; len = key.length; code = ''; for (i = 0; i < string.length; i ) { var k = i % len; code = String.fromCharCode(string.charCodeAt(i) ^ key.charCodeAt(k)) } return base64decode(code) }

我们实际用到的就是这个 strdecode函数,当然要加上密钥函数,密钥可以去网站实际搜索下,即可搜索到,有Gword和hn2个, 另外,这个strdecode函数还调用了另外一个函数:base64decode(),而base64decode又调用了一个 base64DecodeChars 的数组,把这些都 添加文件里面的js代码,encrypt.js 如下:

最好用的js网络爬虫库(利用Python突破大型网站JavaScript反爬虫加密技术)(4)

完整代码

有了加密的js文件,我们就要实现我们最终的python代码,主要流程就是先爬取网页,获取到js加密的网址,然后python调用执行JavaScript代码,进行还原即可。

最终代码如下:

# coding=utf-8 import requests import execjs import re node = execjs.get() # print(execjs.get().name) source_url = 'http://ac.scmor.com/' source_headers = { 'User-Agent':'Mozilla/5.0 (Windows; ) AppleWebKit/537 (KHTML, Gecko) Chrome/55 Safari/537', } source_res = requests.get(url=source_url, headers=source_headers) re_source = re.findall(r'var autourl=\["(.*)"\];var',source_res.text) re_source = re_source[0] file = './encrypt.js' ctx = node.compile(open(file).read()) re_source = re_source.split('","') for each_source in re_source: #print(each_source) md_js = 'strdecode("%s")' % each_source #破解中的函数, href = ctx.eval(md_js) print(href)

执行结果:

最好用的js网络爬虫库(利用Python突破大型网站JavaScript反爬虫加密技术)(5)

当初除了这个模块,还有一个:js2py,pip install js2py 即可安装,比较类似,大家自行学习啦。

好了,就这么多啦,有问题大家可以留言交流,觉得不错,也多多转发和关注迷神哦,后面还将继续分享更多的精彩内容哦。

,