python调⽤js的四种⽅式
⽬录
1. 前⾔
2. 准备
3. ⽅式⼀:PyExecJS
4. ⽅式⼆:js2py
5. ⽅式三:Node.js
6. ⽅式四:PyV8
7. 最后
1. 前⾔
⽇常 Web 端爬⾍过程中,经常会遇到参数被加密的场景,因此,我们需要分析⽹页源代码
通过调式,⼀层层剥离出关键的 JS 代码,使⽤ Python 去执⾏这段代码,得出参数加密前后的 Python 实现本⽂将聊聊利⽤ Python 调⽤ JS 的4种⽅式
2. 准备
以⼀段简单的 JS 脚本为例,将代码写⼊到⽂件中
//norm.js
//计算两个数的和
function add(num1, num2) {
return num1 + num2;
}
其中,定义了⼀个⽅法,计算两个数的和
3. ⽅式⼀:PyExecJS
PyExecJS 是使⽤最多的⼀种⽅式,底层实现⽅式是:在本地 JS 环境下运⾏ JS 代码
⽀持的 JS 环境包含:Node.js、PyV8、PhantomJS、Nashorn 等
⾸先,我们需要安装依赖包 PyExecJS
//py_exec_js_demo.py
//安装依赖
pip3 install PyExecJS
然后,从 JS ⽂件中读取源码
def js_from_file(file_name):
"""
读取js⽂件
:return:
"""
with open(file_name, 'r', encoding='UTF-8') as file:
result = ad()
return result
最后,使⽤ execjs 类的compile()⽅法编译加载上⾯的 JS 字符串,返回⼀个上下⽂对象
import execjs
from js_code import *
# 编译加载js字符串
context1 = execjspile(js_from_file('./norm.js'))
最后,调⽤上下⽂对象的call() ⽅法执⾏ JS ⽅法
其中,参数包含:JS 代码被调的⽅法名、对应⽅法的传⼊参数
# 调⽤js代码中的add()⽅法,参数为2和3
# ⽅法名:add
# 参数:2和3
result1 = context1.call("add", 2, 3)
print(result1)
4. ⽅式⼆:js2py
js2py作为⼀个纯 Python 实现的 JS 解释器,可以完全脱离 JS 环境,直接将 JS 代码转换为 Python 代码⾸先,安装依赖库
# 安装依赖库
pip3 install js2py
然后使⽤ js2py 中的EvalJs()⽅法⽣成⼀个上下⽂对象
# 使⽤获取上下js2py⽣成⼀个上下⽂环境
context = js2py.EvalJs()
接着利⽤上下⽂对象执⾏ JS 脚本,转换为 Python 代码
# 执⾏整段JS代码
最后,利⽤上下⽂调⽤ JS 中的⽅法,并制定输⼊参数即可
# 使⽤上下⽂context调⽤具体的函数
# 函数名:add
# 参数:1,2
result = context.add(1, 2)
print(result)
需要注意是,如果 JS 是很长的混淆代码,转换为 Python 的过程可能会报错
更多功能可以参考:
5. ⽅式三:Node.js
实际上是使⽤ Python 的os.popen执⾏ node 命令,执⾏ JS 脚本
⾸先,确保本地已经安装了 Node.js 环境
修改 JS 脚本,新增⼀个导出函数 init ,⽅便内部函数被调⽤
//计算两个数的和
function add(num1, num2) {
return num1 + num2;
}
//新增⼀个导出函数(node⽅式)
//调⽤函数,并返回
console.log(add(arg1, arg2));
};
然后,将调⽤ JS ⽅法的命令组成⼀个字符串
# 组成调⽤js的命令
# node命令:node -e
cmd = 'node -e "require(\\"%s\\").init(%s,%s)"' % ('./norm', 3, 5)
最后,通过 os.popen 执⾏命令即可
pipeline = os.popen(cmd)
# 读取结果
result = ad()
print('结果是:', result)
6. ⽅式四:PyV8
PyV8 是 Google 将 Chrome V8 引擎⽤ Python 封装的依赖库
它不依赖本地 JS 环境,运⾏速度很快
import PyV8
from js_code import js_from_file
with PyV8.JSContext() as ctx:
ctx.eval(js_from_file('./norm.js'))
# 调⽤js函数,指定参数
js代码加密软件ctx.locals.add(1, 2)
更多功能可以参考:
7. 最后
上⾯总结了 Python 调⽤ JS 的 4 种⽅式
实际爬⾍项⽬中,⼀般会先使⽤ node 命令进⾏⼀次测试,确保没问题后,再使⽤前 3 种⽅式的任意⼀种进⾏ Python 改写以上就是python 调⽤js的四种⽅式的详细内容,更多关于python 调⽤js的资料请关注其它相关⽂章!
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论