网络爬虫执行JS之execjs库使用

网络爬虫执行JS之execjs库使用

网络爬虫执行JS之execjs库使用

当我们不想使用Pyppeteer或者Selenium这样模拟浏览器方式渲染JS时,我们就可以使用PyExecJS库来执行JS。

安装

pip install PyExecJS

支持的渲染引擎

稳定支持引擎(经过测试):
- PyV8 - A python wrapper for Google V8 engine,
- Node.js
- PhantomJS
- Nashorn - Included with Oracle Java 8

不稳定支持引擎(未经过测试):

$ slimerjs --debug=true
Error: Platform version '78.0.1' is not compatible with
minVersion >= 53.0.0
maxVersion <= 59.*
Gecko error: it seems /apps/tools/firefox/firefox is not compatible with SlimerJS.
See Gecko version compatibility. If version is correct, launch slimerjs
with --debug=true to see Firefox error message

Node 安装

wget -c https://nodejs.org/dist/v12.18.3/node-v12.18.3-linux-x64.tar.xz
tar Jxvf node-v12.18.3-linux-x64.tar.xz
mkdir ~/apps/
mv node-v12.18.3-linux-x64 ~/apps/
ln -sf ~/apps/node-v12.18.3-linux-x64 ~/apps/node
export PATH=~/apps/node/bin:$PATH

PhantomJS安装方法

pip install PhantomJS

Mozilla SpiderMonkey 安装

执行一下js命令,看提示安装包名称:

sudo apt install mozjs

Nashorn

安装了Java环境就可以拥有。

spidermonkey 安装

pip install spidermonkey

切换渲染引擎方法

import execjs
import execjs.runtime_names
import os

# 查看环境默认引擎
execjs.get().name

# 切换引擎方法: 设置环境变量
os.environ["EXECJS_RUNTIME"] = execjs.runtime_names.Node
execjs.get().name
node.eval("1 + 2")


# 切换引擎方法: get方法
node = execjs.get(execjs.runtime_names.PhantomJS)
node.eval("1 + 2")

PyV8 = "PyV8"
Node = "Node"
PhantomJS = "PhantomJS"
Nashorn = "Nashorn"

JavaScriptCore = "JavaScriptCore"
SpiderMonkey = "SpiderMonkey"
JScript = "JScript"
SlimerJS = "SlimerJS"

PyExecJS的基础使用方法

  1. 渲染JS脚本: execjs.compile(js_data)
  2. 获取JS变量调用: js_ctx.eval("[mode, method]")
  3. 执行JS方法调用: js_ctx.call("add", 1, 2)
import execjs

js_file = './test.js'
with open(js_file, 'w') as f:
    f.write("""
var mode = "test";
var method = "func";

function add(x, y) {
  return x + y;
}
    """)

with open(js_file, 'r') as f:
    js_data = f.read()

js_ctx = execjs.compile(js_data)

res1 = js_ctx.call("add", 1, 2)
print('res1:', res1)

res2 = js_ctx.eval("[mode, method]")
print('res2:', res2)

验证各种引擎的执行速度

验证的我本机支持的四种引擎:
1. Node
2. PhantomJS
3. Nashorn
4. SpiderMonkey

from timeit import timeit
def test(name):
    node = execjs.get(name)
    node.eval("1+2")
timeit('test("Node")', 'from __main__ import test', number=100)
3.6041686279932037
timeit('test("PhantomJS")', 'from __main__ import test', number=100)
10.584756183990976
timeit('test("Nashorn")', 'from __main__ import test', number=100)
67.66356956699747
timeit('test("SpiderMonkey")', 'from __main__ import test', number=100)
1.8503338219888974
转载本文时请注明出处及本文链接地址网络爬虫执行JS之execjs库使用

发表评论

您的电子邮箱地址不会被公开。 必填项已用*标注