Python-执行Javascript代码

本文最后更新于:2020年12月16日 上午

python javascript

  • PyV8
    V8是Google开源Javascript引擎,被使用在Chrome中
    PyV8是V8引擎的Python包装,可以用来调用V8引擎执行JS代码
    年久失修,最新版本是2010年的
    存在内存泄漏的问题

  • JsPy
    Python实现的Javascript解释器和翻译器
    issues里有很多bug未修复
    解释器 性能不高,存在BUG
    翻译器 对于高度混淆大型Javascript会转换失败,转换出来的代码可读性差,性能不高

  • PyMiniRacer
    PyMiniRacer是V8引擎的Python包装,可以用来调用V8引擎执行JS代码
    继任PyExecJSPyV8的库

  • PyExecJS
    最开始诞生在Ruby中的库,后来被移植到了Python上
    有多个引擎可选,一般选Node.js,因为比较快
    执行大型js代码稍慢
    特殊编码的输入或输出会出现报错,可以将输入输出参数使用Base64编码一下

  • Selenium
    浏览器环境
    Selenium有一个执行js的函数,是一个Web自动化测试工具
    browser.execute_script(js)
    可以运用此函数进行js运行

  • Pyppeteer
    浏览器环境
    Puppeteer的Python版本,由第三方开发,是一个Web自动化测试框架
    原生支持以协程的方式调用,性能比Selenium
    对于用Asyncio + Aiohttp写爬虫而言的人可以直接使用

    1
    await page.evaluate(js, *data)
  • NodeJS
    执行速度快

    • RPC
      写一个简单的RPC服务接口,然后在python调用nodeJS的RPC服务,拿到结果
    • HTTP API
      与写后端代码一样,提供一个可执行JS的HTTP API,通过调用API来执行JS获得结果

      Node.js对象没有浏览器才有的window对象,如果需要使用,可以直接建立对象,也可以使用sjdom这个库
      window.btoa在nodejs中不存在,可以使用Buffer.from(‘..’).toString(‘base64’)解决

python 执行 javascript

PyExecJS

需要注意,这是单独的js运行,并没有浏览器参数
如果js中一些内容引用到了浏览器参数,很可能会报错

安装

安装js运行环境

推荐安装Node.js

配置Node.js

修改包路径与cache路径

cmd中输入

1
2
npm config set prefix "F:\Environment\Node_js\node_global"
npm config set chche "F:\Environment\Node_js\node_cache"

安装PyExecJS

1
pip install pyexecjs

检验安装是否成功

1
2
3
4
5
6
7
8
9
10
import execjs
print("如果装了Node.js, 会显示 Node.js", execjs.get().name)
js_text = '''
function hello_world(){
return "Hello World";
}
'''
ctx = execjs.compile(js_text) # 编译js代码
a = ctx.call('hello_world')
print(a)

运行代码,若是正确显示Hello World则成功

gbk编码问题


其默认编码格式是跟随系统的
也就是说,windows下如果你不做设定,那么会是gbk
gbk碰到一些奇怪的字符就会不能编码
寻找构造函数,将编码默认值设定为utf-8

这样实际上是修改了包的源码,在其他系统上跑的话需要多加留意


本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!