图/文:迷神
现在写爬虫也难啊,现在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文件,来抓取活的最终这个上面的所有镜像网址。
目标地址
目标网址里面的地址,都是被加密过的,如图:
加密地址了
通过查看发觉是使用一个叫visit() 的js函数加密了:
加密
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代码,主要流程就是先爬取网页,获取到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)
执行结果:
当初除了这个模块,还有一个:js2py,pip install js2py 即可安装,比较类似,大家自行学习啦。
好了,就这么多啦,有问题大家可以留言交流,觉得不错,也多多转发和关注迷神哦,后面还将继续分享更多的精彩内容哦。
,