Python调用JavaScript执行代码
目标:
- 为什么需要直接调用JS
- 常见的Python 调用 JS库
- 了解一种性能更高的操作方式
- 什么场景下用什么方式对JS进行调用
各种调用 JS 的库
PyV8
- GOOGLE开源的JS引擎,被使用在Chrome中
- 是V8引擎中的一个Python层封装,可以用来调用V8引擎执行JS代码
- 不推荐使用,年久失修,存在内存泄漏,不建议使用
Js2Py
- 纯Python实现的JS解释器和翻译器
- Bug较多,性能不高,不建议使用
PyExecJS
- 有多个引擎可行,一般选择NodeJS作为引擎执行代码,建议使用
- 执行大型JS会有点慢
- 特殊编码的输入或输入参数会出现报错情况(可把输入或输出的参数使用BASE64编码一下)
PyminiRacer
- 同样是V8引擎封装,和PyV8效果一样
Selenium
- WEB自动化测试框架,可以驱动各种浏览器模拟人工操作
- 渲染页面方便提取数据或过验证码
- 直接驱动浏览器执行JS
js='jscode' result = browser.execute_script(js)
Pyppeteer
- Puppeteer 的 Python 版本,第三方开发,WEB自动化测试框架
- 支持协程方式调用,性能比Selenium更高
- 直接驱动浏览器执行JS代码
result = await page.evaluate(js,*data) result = await page.evaluateOnNewDocument(js,*data) #页面加载前执行JS
使用PyExecJS
安装Node.js
安装PyexecJS
- pip install PyExecJS
import execjs execjs.get().name #正常输出Node.js(V8) #长期使用 os.environ["EXECJS_RUNTIME"]='Node' #临时使用 import execjs.runtime_names node=execjs.get(execjs.runtime_names.Node)
import execjs e=execjs.eval('a=new Array(1,2,3)') #直接执行JS代码
import execjs jstext=''' function hello(str){ return str;} ''' ctx=execjs.compile(jstext) #编译JS代码 a=ctx.call("hello","hello world")
NodeJS 实现接口
HTTP API
const express = require('express') const app = express() const sum = require("./sum") var bodyParser = require('bady-parser') app.use(bodyParser()) app.post('/get_num',function(req,res){ let result = req.body console.log("result",result) let a=parseInt(result.a) let b=parseInt(result.b) result=sum.add(a,b) res.send(result.toString()); }) app.listen(3000,()==>{ console.log("开启服务,端口3000") })
本站所有资源版权均属于原作者所有,这里所提供资源均只能用于参考学习使用,请在下载后24小时内删除,严禁商用。若由于商用引起版权纠纷,一切责任均由使用者承担。
【注意:本站发布资源来源于网络搜集,均有较强时效性,请在下载前注意查看文章资源发布或更新时间,距离当前时间太久的资源不建议下载,特别是安卓专区相关资源,会有大概率失效无法使用】
评论(0)