python 调用js的四种方式


Posted in Python onApril 11, 2021

1. 前言

日常 Web 端爬虫过程中,经常会遇到参数被加密的场景,因此,我们需要分析网页源代码

通过调式,一层层剥离出关键的 JS 代码,使用 Python 去执行这段代码,得出参数加密前后的 Python 实现

本文将聊聊利用 Python 调用 JS 的4种方式

2. 准备

以一段简单的 JS 脚本为例,将代码写入到文件中

//norm.js
//计算两个数的和
function add(num1, num2) {
    return num1 + num2;
}

其中,定义了一个方法,计算两个数的和

3. 方式一:PyExecJS

PyExecJS 是使用最多的一种方式,底层实现方式是:在本地 JS 环境下运行 JS 代码
支持的 JS 环境包含:Node.js、PyV8、PhantomJS、Nashorn 等
首先,我们需要安装依赖包 PyExecJS

//py_exec_js_demo.py

//安装依赖
pip3 install PyExecJS

然后,从 JS 文件中读取源码

def js_from_file(file_name):
    """
    读取js文件
    :return:
    """
    with open(file_name, 'r', encoding='UTF-8') as file:
        result = file.read()

    return result

最后,使用 execjs 类的compile()方法编译加载上面的 JS 字符串,返回一个上下文对象

import execjs

from js_code import *

# 编译加载js字符串
context1 = execjs.compile(js_from_file('./norm.js'))

最后,调用上下文对象的call() 方法执行 JS 方法
其中,参数包含:JS 代码被调的方法名、对应方法的传入参数

# 调用js代码中的add()方法,参数为2和3
# 方法名:add
# 参数:2和3
result1 = context1.call("add", 2, 3)

print(result1)

需要注意的,由于 PyExecJS 运行在本地 JS 环境下,使用之前会启动 JS 环境,最终导致运行速度会偏慢
更多功能可以参考:
https://github.com/doloopwhile/PyExecJS

4. 方式二:js2py

js2py作为一个纯 Python 实现的 JS 解释器,可以完全脱离 JS 环境,直接将 JS 代码转换为 Python 代码

首先,安装依赖库

# 安装依赖库
pip3 install js2py

然后使用 js2py 中的EvalJs()方法生成一个上下文对象

# 使用获取上下js2py生成一个上下文环境
context = js2py.EvalJs()

接着利用上下文对象执行 JS 脚本,转换为 Python 代码

# 执行整段JS代码
context.execute(js_content)

最后,利用上下文调用 JS 中的方法,并制定输入参数即可

# 使用上下文context调用具体的函数
# 函数名:add
# 参数:1,2
result = context.add(1, 2)
print(result)

需要注意是,如果 JS 是很长的混淆代码,转换为 Python 的过程可能会报错

更多功能可以参考:

https://github.com/PiotrDabkowski/Js2Py

5. 方式三:Node.js

实际上是使用 Python 的os.popen执行 node 命令,执行 JS 脚本

首先,确保本地已经安装了 Node.js 环境

修改 JS 脚本,新增一个导出函数 init ,方便内部函数被调用

//计算两个数的和
function add(num1, num2) {
    return num1 + num2;
}

//新增一个导出函数(node方式)
module.exports.init = function (arg1, arg2) {
    //调用函数,并返回
    console.log(add(arg1, arg2));
};

然后,将调用 JS 方法的命令组成一个字符串

# 组成调用js的命令
# node命令:node -e
cmd = 'node -e "require(\\"%s\\").init(%s,%s)"' % ('./norm', 3, 5)

最后,通过 os.popen 执行命令即可

pipeline = os.popen(cmd)

# 读取结果
result = pipeline.read()

print('结果是:', result)

6. 方式四:PyV8

PyV8 是 Google 将 Chrome V8 引擎用 Python 封装的依赖库

它不依赖本地 JS 环境,运行速度很快

import PyV8
from js_code import js_from_file

with PyV8.JSContext() as ctx:
    ctx.eval(js_from_file('./norm.js'))

# 调用js函数,指定参数
ctx.locals.add(1, 2)

更多功能可以参考:

https://github.com/emmetio/pyv8-binaries

7. 最后

上面总结了 Python 调用 JS 的 4 种方式

实际爬虫项目中,一般会先使用 node 命令进行一次测试,确保没问题后,再使用前 3 种方式的任意一种进行 Python 改写

示例代码地址:https://github.com/xingag/tools_python/tree/master/Python%E6%89%A7%E8%A1%8CJS%E6%80%BB%E7%BB%93

以上就是python 调用js的四种方式的详细内容,更多关于python 调用js的资料请关注三水点靠木其它相关文章!

Python 相关文章推荐
python装饰器使用方法实例
Nov 21 Python
Python中使用插入排序算法的简单分析与代码示例
May 04 Python
python 获取网页编码方式实现代码
Mar 11 Python
基于使用paramiko执行远程linux主机命令(详解)
Oct 16 Python
python MySQLdb使用教程详解
Mar 20 Python
Django 实现购物车功能的示例代码
Oct 08 Python
python实现全盘扫描搜索功能的方法
Feb 14 Python
python微信撤回监测代码
Apr 29 Python
python实现对象列表根据某个属性排序的方法详解
Jun 11 Python
TensorFlow2.1.0最新版本安装详细教程
Apr 08 Python
Django多数据库联用实现方法解析
Nov 12 Python
Python 处理表格进行成绩排序的操作代码
Jul 26 Python
Python WSGI 规范简介
使用pytorch实现线性回归
pytorch实现线性回归以及多元回归
python如何获取网络数据
Apr 11 #Python
Pytorch 使用tensor特定条件判断索引
selenium.webdriver中add_argument方法常用参数表
Apr 08 #Python
python3使用diagrams绘制架构图的步骤
You might like
php smarty模版引擎中的缓存应用
2009/12/11 PHP
php不允许用户提交空表单(php空值判断)
2013/11/12 PHP
php计算两个坐标(经度,纬度)之间距离的方法
2015/04/17 PHP
php使用正则表达式去掉html中的注释方法
2016/11/03 PHP
JavaScript.Encode手动解码技巧
2010/07/14 Javascript
Nodejs express框架一个工程中同时使用ejs模版和jade模版
2015/12/28 NodeJs
个人网站留言页面(前端jQuery编写、后台php读写MySQL)
2016/05/03 Javascript
jQuery简单实现页面元素置顶时悬浮效果示例
2016/08/01 Javascript
基于JS实现的随机数字抽签实例
2016/12/08 Javascript
JS中使用gulp实现压缩文件及浏览器热加载功能
2017/07/12 Javascript
关于vue单文件中引用路径的处理方法
2018/01/08 Javascript
在Vue项目中引入腾讯验证码服务的教程
2018/04/03 Javascript
使用js实现单链解决前端队列问题的方法
2020/02/03 Javascript
在vue中使用inheritAttrs实现组件的扩展性介绍
2020/12/07 Vue.js
微信小程序用户登录和登录态维护的实现
2020/12/10 Javascript
Python __setattr__、 __getattr__、 __delattr__、__call__用法示例
2015/03/06 Python
轻松实现python搭建微信公众平台
2016/02/16 Python
python中关于for循环的碎碎念
2017/06/30 Python
Python金融数据可视化汇总
2017/11/17 Python
python3 遍历删除特定后缀名文件的方法
2018/04/23 Python
Python向Excel中插入图片的简单实现方法
2018/04/24 Python
对numpy中的transpose和swapaxes函数详解
2018/08/02 Python
python编写简单端口扫描器
2019/09/04 Python
python爬虫实现POST request payload形式的请求
2020/04/30 Python
使用 django orm 写 exists 条件过滤实例
2020/05/20 Python
python如何导入依赖包
2020/07/13 Python
python json.dumps() json.dump()的区别详解
2020/07/14 Python
Python爬虫之爬取淘女郎照片示例详解
2020/07/28 Python
英国在线珠宝店:The Jewel Hut
2017/03/20 全球购物
办公室内勤岗位职责范本
2013/12/09 职场文书
2014广电局实施党的群众路线教育实践活动方案思想汇报
2014/09/22 职场文书
工厂见习报告范文
2014/10/31 职场文书
幼儿园辞职信范文
2015/02/27 职场文书
2015年招生工作总结
2015/05/04 职场文书
高三英语教学反思
2016/03/03 职场文书
不会写演讲稿,快来看看这篇文章!
2019/08/06 职场文书