2023年6月29日发(作者:)
最全总结!聊聊Python调⽤JS的⼏种⽅式1. 前⾔⽇常 Web 端爬⾍过程中,经常会遇到参数被加密的场景,因此,我们需要分析⽹页源代码通过调式,⼀层层剥离出关键的 JS 代码,使⽤ Python 去执⾏这段代码,得出参数加密前后的 Python 实现本⽂将聊聊利⽤ Python 调⽤ JS 的4种⽅式2. 准备以⼀段简单的 JS 脚本为例,将代码写⼊到⽂件中////计算两个数的和function add(num1, num2) { return num1 + num2;}其中,定义了⼀个⽅法,计算两个数的和3. ⽅式⼀:PyExecJSPyExecJS 是使⽤最多的⼀种⽅式,底层实现⽅式是:在本地 JS 环境下运⾏ JS 代码⽀持的 JS 环境包含:、PyV8、PhantomJS、Nashorn 等⾸先,我们需要安装依赖包 PyExecJS//py_exec_js_//安装依赖pip3 install PyExecJS然后,从 JS ⽂件中读取源码def js_from_file(file_name): """ 读取js⽂件 :return: """ with open(file_name, 'r', encoding='UTF-8') as file: result = () return result最后,使⽤ execjs 类的compile()⽅法编译加载上⾯的 JS 字符串,返回⼀个上下⽂对象import execjsfrom js_code import *# 编译加载js字符串context1 = e(js_from_file('./'))最后,调⽤上下⽂对象的call() ⽅法执⾏ JS ⽅法其中,参数包含:JS 代码被调的⽅法名、对应⽅法的传⼊参数# 调⽤js代码中的add()⽅法,参数为2和3# ⽅法名:add# 参数:2和3result1 = ("add", 2, 3)print(result1)需要注意的,由于 PyExecJS 运⾏在本地 JS 环境下,使⽤之前会启动 JS 环境,最终导致运⾏速度会偏慢4. ⽅式⼆:js2pyjs2py作为⼀个纯 Python 实现的 JS 解释器,可以完全脱离 JS 环境,直接将 JS 代码转换为 Python 代码⾸先,安装依赖库# 安装依赖库pip3 install js2py然后使⽤ js2py 中的EvalJs()⽅法⽣成⼀个上下⽂对象# 使⽤获取上下js2py⽣成⼀个上下⽂环境context = ()接着利⽤上下⽂对象执⾏ JS 脚本,转换为 Python 代码# 执⾏整段JS代码e(js_content)最后,利⽤上下⽂调⽤ JS 中的⽅法,并制定输⼊参数即可# 使⽤上下⽂context调⽤具体的函数# 函数名:add# 参数:1,2result = (1, 2)print(result)需要注意是,如果 JS 是很长的混淆代码,转换为 Python 的过程可能会报错5. ⽅式三:实际上是使⽤ Python 的执⾏ node 命令,执⾏ JS 脚本⾸先,确保本地已经安装了 环境修改 JS 脚本,新增⼀个导出函数 init ,⽅便内部函数被调⽤//计算两个数的和function add(num1, num2) { return num1 + num2;}//新增⼀个导出函数(node⽅式) = function (arg1, arg2) { //调⽤函数,并返回 (add(arg1, arg2));};然后,将调⽤ JS ⽅法的命令组成⼀个字符串# 组成调⽤js的命令# node命令:node -ecmd = 'node -e "require("%s").init(%s,%s)"' % ('./norm', 3, 5)最后,通过 执⾏命令即可pipeline = (cmd)# 读取结果result = ()print('结果是:', result)6. ⽅式四:PyV8PyV8 是 Google 将 Chrome V8 引擎⽤ Python 封装的依赖库它不依赖本地 JS 环境,运⾏速度很快import PyV8from js_code import js_from_filewith ext() as ctx: (js_from_file('./'))# 调⽤js函数,指定参数(1, 2)但是经过反复测试发现,MAC 和 PC 在 Python3 环境下,使⽤ PyV8 会报各种奇怪的问题,所以不推荐使⽤!7. 最后上⾯总结了 Python 调⽤ JS 的 4 种⽅式实际爬⾍项⽬中,⼀般会先使⽤ node 命令进⾏⼀次测试,确保没问题后,再使⽤前 3 种⽅式的任意⼀种进⾏ Python 改写
发布者:admin,转转请注明出处:http://www.yc00.com/web/1687984240a63745.html
评论列表(0条)