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")
})

发表回复

后才能评论