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代码
继任PyExecJS
和PyV8
的库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’)解决
- RPC
python 执行 javascript
PyExecJS
需要注意,这是单独的js运行,并没有浏览器参数
如果js中一些内容引用到了浏览器参数,很可能会报错
安装
安装js运行环境
推荐安装Node.js
配置Node.js
修改包路径与cache路径
cmd中输入
1 |
|
安装PyExecJS
1 |
|
检验安装是否成功
1 |
|
运行代码,若是正确显示Hello World则成功
gbk编码问题
其默认编码格式是跟随系统的
也就是说,windows下如果你不做设定,那么会是gbk
gbk
碰到一些奇怪的字符就会不能编码
寻找构造函数,将编码默认值设定为utf-8
这样实际上是修改了包的源码,在其他系统上跑的话需要多加留意
本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!