17-Python执行JS代码--PyExecJS、PyV八、Js2Py

1、Python执行JS代码--PyExecJS、PyV八、Js2Py

1.一、PyExecJSpython

  PyExecJS的优势是您不须要照顾JavaScript环境。特别是,它能够在Windows环境中运行,而无需安装额外的库。PyExecJS缺点之一是性能PyExecJS经过文本传达JavaScript运行时,而且运行缓慢。另外一个缺点是它不彻底支持运行时特定的功能。对于某些用例,PyV8多是更好的选择。安装以前先安装JS环境,Node.js安装好了,就能够安装接下来的库了。git

安装:github

pip3 install -i https://pypi.douban.com/simple PyExecJS
import execjs execjs.get().name # 查看调用的环境 'Node.js (V8)'
ctx = execjs.compile(""" function add(x, y) { return x + y; } """) print(ctx.call("add", 1, 2)) #3
 with open("enc.js", "r", encoding="utf-8") as f: #执行js文件 js = execjs.compile(f.read()) url = js.call("posturl") print(url) #http://www.renren.com/ajaxLogin/login?1=1&uniqueTimestamp=2019115032868

enc.js:ajax

function posturl() { var s = new Date; url = "http://www.renren.com/ajaxLogin/login?1=1" + "&uniqueTimestamp=" + s.getFullYear() + s.getMonth() + s.getDay() + s.getHours() + s.getSeconds() + s.getUTCMilliseconds(); return url }

1.二、PyV8函数

  PyV8Google V8引擎的Python包装器,它充当PythonJavaScript之间的桥梁?对象,并支持使用python脚本托管Googlev8引擎。和 `PyExecJS` 相比,这个库很轻量,不须要额外装 JS 环境,由于 V8 自己就是环境,同时也由于不须要启动外部环境,执行速度很快。Python3 安装不要使用pip,由于官方只支持 Python2,须要在这里下载对应系统的二进制文件, 而后解压后将 PyV8.py 与 _PyV8.so (如so不是这个名字须要改为这样) 两文件复制到 Pythonsite-packages 目录下,如 /usr/local/lib/python3.6/site-packagespost

下载地址:性能

https://github.com/emmetio/pyv8-binaries
import PyV8  # 注意大小写
with PyV8.JSContext() as ctx: ctx.eval(""" function add(x, y) { return x + y; } """) print(ctx.locals.add(1, 2)) #3

1.三、Js2Py网站

  将JavaScript转换为Python代码。Js2Py几乎能够翻译和执行任何JavaScript代码。Js2Py用纯python编写,没有任何依赖关系。基本上是纯PythonJavaScript核心的实现。这种方式能够摆脱调用 JS 环境的瓶颈,但遗憾的是若是用于很长的混淆 JS 代码,转译过来的大几率会报错… 因此只建议先尝试一下,若是报错及时更换上面的库。url

安装:spa

pip3 install -i https://pypi.douban.com/simple js2py
import js2py add = js2py.eval_js(""" function add(x, y) { return x + y; } """) print(add)  # 能够看到大括号里已被转译 #'function add(x, y) { [python code] }'

print(add(1, 2)) #3
import js2py # 使用下边这个方法能够输出转译后的代码 # 能够保存到文件里,下次不须要再次转译
print(js2py.translate_js('var x = 1')) #打印结果:
""" from js2py.pyjs import * # setting scope var = Scope( JS_BUILTINS ) set_global_object(var) # Code follows: var.registers(['x']) var.put('x', Js(1.0)) """

实战技巧:

  接下来就是定位目标网页须要调用的 JS 函数,每一个网站的写法都大不相同。只要经过 Debug查看数据从请求,每一步都通过哪些 JS 函数,输出什么样的数据,就能够顺藤摸瓜找到一些可疑的函数,而后将这些方法逐一复制出来,层层去除多余代码,经过上面的库传入参数执行,看是否和目标网页处理后的数据一致,就能够找到目标函数。

相关文章
相关标签/搜索