Python执行JS代码的三种方式
作者:银古_1427
以前的数据靠买,现在的数据靠爬”,越来越多的学者通过网络爬虫来获取数据,但是做爬虫的人都知道,现在的很多网站都在和我们斗智斗勇,防护普遍越来越好,破解JS加密只是第一步,之后就是如何在我们的Python代码中直接执行JS,下面介绍一下几种Python中执行JS代码的方法
1. 使用 js2py
基本操作:
import js2py # 执行单行js语句 js2py.eval_js("console.log(abcd)") >>> abcd # 执行js函数 add = js2py.eval_js("function add(a, b) {return a + b};") print(add(1,2)) >>> 3 # 另一种方式 js = js2py.EvalJs({}) js.execute("js语句")
骚操作一: 在js代码中引入python对象 或 python代码
# 在js代码中引入python对象 context = js2py.EvalJs({'python_sum': sum}) context.eval('python_sum(new Array(1,4,2,7))') >>> 14 # 在js代码中加入python代码 js_code = ''' var a = 10 function f(x) {return x*x} ''' context.execute(js_code) context.f("14") 或 context.f(14) >>> 196
骚操作二: 将js代码转为python模块,再使用import 导入
# 转换js文件 js2py.translate_file('example.js', 'example.py') # 现在可以导入example.py from example import example example.someFunction()
详见:https://github.com/PiotrDabkowski/Js2Py
2. 使用 execjs
import execjs js_code = open('file.js',encoding='utf-8').read() ctx = execjs.compile(js_code) # 第一个参数为ja代码中的函数名, 后面为函数对应的参数 result = ctx.call('function_name', *args)
3. 使用subprocess调用node子进程
前面两种只适合执行少量js代码的情况,当有大量js代码要执行时,还是建议直接调用node
import subprocess # js文件最后必须有输出,我使用的是 console.log pro = subprocess.run("node abc.js", stdout=subprocess.PIPE) # 获得标准输出 _token = pro.stdout # 转一下格式 token = _token.decode().strip()
关于执行效率:
py2js有时候在加载一些加密函数的时候效率低的可怜,大概是因为执行机制的不同:
py2js直接调用的nodejs引擎不过这个库用的nodejs解析语法树转成py代码,性能挺低的,还不如直接用execjs调nodejs或自己封装子进程调用;execjs调用的pyv8,不过默认的pyv8的引擎挺老的,es5好多特征都不支持
以上就是Python执行JS代码的三种方式的详细内容,更多关于Python执行JS代码的资料请关注脚本之家其它相关文章!