文章目录

  • 1. 安装
  • 2. 简单使用
  • 3. 调用函数
  • 4. 执行JS的环境
  • 5.环境切换
  • 6. 简易性能分析

1. 安装

pip install PyExecJS  # 需要注意, 包的名称:PyExecJS

2. 简单使用

import execjsexecjs.eval("new Date")
返回值为: 2018-04-04T12:53:17.759Z
execjs.eval("Date.now()")
返回值为:1522847001080  # 需要注意的是返回值是13位, 区别于python的time.time()

需要注意的是: 个别的JS语句, 用execjs返回的结果跟浏览器环境返回的结果是有区别的, 以下是浏览器环境返回的结果

3. 调用函数

import execjs
ctx = execjs.compile("""function add(x, y) {return x + y;}
""") # 获取代码编译完成后的对象
print(ctx.call("add", 1, 2)) # 3
# print(ctx.eval("add({0},{1})").format(1,2)) # 报错
print(ctx.eval('add("{0}", "{1}")').format("1","2")) # 12

文件读取代码编写

创建jsCode.js的文件

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

执行代码

import execjs
file = 'jsCode.js'
ctx = execjs.compile(open(file).read())
js = 'add("{0}", "{1}")'.format("1","2")
params = ctx.eval(js)
print(params) # 12
params = ctx.call('add',1,2)
print(params) # 3

出现错误提示

UnicodeEncodeError: 'gbk' codec can't encode character xxx

解决方案一

添加encoding="utf-8"

ctx = execjs.compile(open(file,encoding="utf-8").read())

解决方案二

js文件以GBk方式保存

execjs的用法非常简单, 下边来看一下执行JS的环境, 以及性能:

4. 执行JS的环境

  • 在windows上不需要其他的依赖便可运行execjs, 也可以调用其他的JS环境
windows 默认的执行JS的环境
execjs.get().name
返回值: JScript作者本人的windows上装有Node.js , 所以返回值不同
execjs.get().name
返回值: Node.js (V8)
  • 在ubuntu下需要安装执行JS环境依赖, 作者的环境为PhantomJS
execjs.get().name
返回值: PhantomJS
  • 源码中给出, 可执行execjs的环境:
  PyV8           = "PyV8"Node           = "Node"JavaScriptCore = "JavaScriptCore"SpiderMonkey   = "SpiderMonkey"JScript        = "JScript"PhantomJS      = "PhantomJS"SlimerJS       = "SlimerJS"Nashorn        = "Nashorn"

在ubuntu环境下, 没有JS环境会报错:Could not find an available JavaScript runtime. 由此可见, execjs在ubuntu需要安装JS环境 。具体的JS环境需根据具体的需求安装, 切不可超过以上8种。

5.环境切换

  • 通过os.environ
os.environ["EXECJS_RUNTIME"] = "Node"
execjs.get().name
execjs.eval("1 + 2")
  • 通过execjs.get 切换
jscript = execjs.get(execjs.runtime_names.JScript)  # runtime_names 便是execjs源码中给出的执行环境的。 execjs.runtime_names.xxx  xxx必须在上一节 #3中取
jscript.eval("1 + 2")

注: 在切换环境时, 当环境不存在不会报错, 会使用默认的环境。 另外需要注意的是, 两种方式的区别

6. 简易性能分析

 # 只简单试了三种, 在windows下
import  execjs
import os
import time# 先用JScript
os.environ["EXECJS_RUNTIME"] = "JScript"
print execjs.get().nametime1 = time.time()
for i in range(100):execjs.eval("new Date")
print time.time() - time1# 切换环境 使用Nodejs
os.environ["EXECJS_RUNTIME"] = "Node"
print execjs.get().nametime2 = time.time()
for l in range(100):execjs.eval("new Date")
print time.time() - time2# 打印的结果为:
JScript
4.70900011063
Node.js (V8)
27.501999855# 在ubuntu下试的是PhantoJS , 结果竟然高达 30+ S

此注释来自execjs作者:PyExecJS的缺点之一就是性能。PyExecJS通过文本传递JavaScript运行时,并且速度很慢。另一个缺点是它不完全支持运行时特定的功能。对于某些用例,PyV8可能是更好的选择。

总注:使用execjs的难点并不是在execjs这个库, 而是解析JS的过程, 因为没有浏览器的环境, 没有加密源码的依赖。从成千上万行的JS中择出想要的内容,可能是一段孤零零的JS函数,也可能是从几个JS文件去找出各自找出一段JS代码, 并可以通过execjs顺利执行, 这并非易事。 需要慢慢积累经验。 一旦掌握, 便可以提高爬虫的效率, 以及代码的健壮性, 节省资源!

来源:https://www.cnblogs.com/xiaoqianbook/p/11243689.html

[284]python使用execjs执行js相关推荐

  1. python通过execjs运行js代码

    python通过execjs运行js代码 pip install PyExecJS 使用方法 import execjsctx = execjs.compile(""" ...

  2. python不弹窗执行js_python使用execjs执行js

    python 执行js代码 简单调用 importexecjs execjs.eval("new Date") 返回值为:2018-04-04T12:53:17.759Z exec ...

  3. python爬虫执行js代码_爬虫之python3用execjs执行JS代码

    JS运行环境 Node.js 是Javascript语言服务器端运行环境 测试运行 测试运行JavaScript程序 微软windows操作系统:附件-命令提示符 需进入到js程序的目录下,node命 ...

  4. python执行js文件报错_使用PyV8在Python爬虫中执行js代码

    前言 可能很多人会觉得这是一个奇葩的需求,爬虫去好好的爬数据不就行了,解析js干嘛?吃饱了撑的? 搜索一下互联网上关于这个问题还真不少,但是大多数童鞋是因为自己的js基础太烂,要么是HTML基础烂,要 ...

  5. execjs执行js代码

    mport execjs print(execjs.get().name) Node.js (V8) 打开js文件读取 import execjs file = 'v.js' node = execj ...

  6. python 使用node_vm2执行js

    有时候,一些js需要调用,之前都是用nodejs比较多,但是有些js会验证是否使用的是node 就比如某头条的加密.为了能本地调用扣下来的js,这里就不能用nodejs或者execjs, 需要用到vm ...

  7. execjs执行js出现window对象未定义时的解决_JS逆向 | 助力新手 , 两个JS逆向喂饭教程...

    练手喂饭系列来喽~这周在读者群顺手搞了个小活动,在群里摸鱼的时候有水友说练手系列能不能来点简单的写详细点.所以我这次准备了两个比较简单的练手加密,从分析到复写加密一步一步截图,我就不信这样你还学不会! ...

  8. python使用execJS运行js函数例子

    #需安装execJS pip install PyExecJS #调用js进行base64加解密操作 import execjs import base64 def encode(input):wit ...

  9. execjs执行js出现window对象未定义时的解决_10个常见的JS语言错误总汇

    1. Uncaught TypeError: Cannot Read Property 这是 JavaScript 开发人员最常遇到的错误.当你读取一个属性或调用一个未定义对象的方法时,Chrome ...

最新文章

  1. 又一数据挖掘赛事,在校生专属,翼支付杯来了(直通实习机会)
  2. 20 个最常用的 Git 命令,码住!
  3. 你不知道的《阿里巴巴Java开发手册》背后故事
  4. html中如何显示纯文本,从Html中取出纯文本
  5. visual studio for mac在线安装网络错误
  6. 总结过去10年的程序员生涯
  7. Day1通信基本概念 通信系统模型 通信系统分类与通信方式
  8. 解读主流CDN厂商的节点数据
  9. Qt 中Socket编程实例
  10. php求1到100的素数之和,php 质数计算 求100以内质数和
  11. ISO18000-6C 电子标签数据存储空间及数据加密说明
  12. WinZip 11 汉化注册版
  13. Java的11个关键术语
  14. CSS过滤器(CSS filters)
  15. html肤质测试,皮肤致敏试验
  16. 炮轰三国服务器维护,炮轰三国上红色要多少个精华 | 手游网游页游攻略大全
  17. 如何做好一个软件测试管理者,高效带好团队呢?
  18. 手写Vuex核心原理,再也不怕面试官问我Vuex原理
  19. 阿里云天池大赛赛题(机器学习)——O2O优惠券预测(完整代码)
  20. UI自动化执行遇到的问题汇总

热门文章

  1. 项目开发中,真的有必要定义VO,BO,PO,DO,DTO这些吗?
  2. 18、CSS基础——属性值的计算过程
  3. NOIP2014、2015普及组初赛难点整理
  4. Git - git checkout git branch 创建/删除分支用法及区别
  5. 一些不错的GI的资料链接
  6. win10图标重建缓存_如何在Windows 10中重建损坏的图标缓存
  7. 塑料袋吹膜机多少钱一台_塑料袋制袋机多少钱一台-卓越机械(在线咨询)-塑料袋制袋机...
  8. python经济学_用python学习中级微观经济学【WARP篇】
  9. 【黄啊码】MySQL入门—14、细说数据库的MVCC机制
  10. 【服务器数据恢复】nas存储服务器的数据恢复案例