网站首页 > 基础教程 正文
图/文:迷神
现在写爬虫也难啊,现在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 即可安装,比较类似,大家自行学习啦。
好了,就这么多啦,有问题大家可以留言交流,觉得不错,也多多转发和关注迷神哦,后面还将继续分享更多的精彩内容哦。
- 上一篇: Eval加密的终极用法
- 下一篇: Python爬虫教程:JS逆向之某团美食商铺数据获取
猜你喜欢
- 2024-12-03 《深入理解javascript原型和闭包系列》 知识点整理
- 2024-12-03 Pyodide:将 Python 引入浏览器
- 2024-12-03 盘点全网最火的 10+ JavaScript引擎!QuickJS 只是其一!
- 2024-12-03 人均瑞数系列,瑞数 5 代 JS 逆向分析
- 2024-12-03 JavaScript黑科技:隐秘执行
- 2024-12-03 深入理解javascript--笔记
- 2024-12-03 Python爬虫教程:JS逆向之某团美食商铺数据获取
- 2024-12-03 Eval加密的终极用法
- 2024-12-03 渗透技巧|当爆破遇到JS加密
- 2024-12-03 深入理解JS:var、let、const的异同
- 最近发表
- 标签列表
-
- gitpush (61)
- pythonif (68)
- location.href (57)
- tail-f (57)
- pythonifelse (59)
- deletesql (62)
- c++模板 (62)
- css3动画 (57)
- c#event (59)
- linuxgzip (68)
- 字符串连接 (73)
- nginx配置文件详解 (61)
- html标签 (69)
- c++初始化列表 (64)
- exec命令 (59)
- canvasfilltext (58)
- mysqlinnodbmyisam区别 (63)
- arraylistadd (66)
- node教程 (59)
- console.table (62)
- c++time_t (58)
- phpcookie (58)
- mysqldatesub函数 (63)
- window10java环境变量设置 (66)
- c++虚函数和纯虚函数的区别 (66)