0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看威廉希尔官方网站 视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

Python调用JS的 4 种方式

科技绿洲 来源:Python实用宝典 作者:Python实用宝典 2023-10-30 09:41 次阅读

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)

但是经过反复测试发现,MAC 和 PC 在 Python3 环境下,使用 PyV8 会报各种奇怪的问题,所以不推荐使用!

更多功能可以参考:

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

7. 最后

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

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

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • Web
    Web
    +关注

    关注

    2

    文章

    1263

    浏览量

    69454
  • JS
    JS
    +关注

    关注

    0

    文章

    78

    浏览量

    18101
  • 源代码
    +关注

    关注

    96

    文章

    2945

    浏览量

    66741
  • 编译
    +关注

    关注

    0

    文章

    657

    浏览量

    32867
  • python
    +关注

    关注

    56

    文章

    4795

    浏览量

    84663
收藏 人收藏

    评论

    相关推荐

    一文详解python调用函数

    函数被定义后,本身是不会自动执行的,只有在被调用后,函数才会被执行,得到相应的结果。但是在 Python 中我们要注意一个关键点,就是Python不允许前向引用,即在函数定义之前,不允许调用
    发表于 10-01 10:45 683次阅读

    5Python实现方式详解

    python就是是一面向对象的解释型计算机程序设计语言,具有丰富和强大的库,语言因其简洁性、易读性以及可扩展性受到欢迎。python可用于图形处理、数学处理、文本处理、数据库编程、网络编程、Web
    发表于 05-22 15:52

    labview如何调用Python

    最近在尝试用labview调用Python的软件,目前知道的有两方式,一是NI开发的enthought工具包,这个需要购买,且试用期为3
    发表于 01-10 13:53

    使用 Python 执行 js 代码

    为什么要引出Python执行js这个问题?都说术业有专攻,每个语言也都有自己的长处和短处。在爬虫方向,Python绝对是扛把子,近几年随着AI的火爆,需要各种各样的数据,所以,爬虫需求也跟着
    发表于 03-31 16:05

    python代码示例之基于Python的日历api调用代码实例

    本文档的主要内容详细介绍的是python代码示例之基于Python的日历api调用代码实例。
    发表于 09-06 14:25 42次下载
    <b class='flag-5'>python</b>代码示例之基于<b class='flag-5'>Python</b>的日历api<b class='flag-5'>调用</b>代码实例

    HarmonyOS如何自动生成JS FA调用Java PA的模板代码

    JS UI框架提供了JS FA(Feature Ability)调用Java PA(Particle Ability)的机制,该机制提供了一通道来传递方法
    的头像 发表于 09-28 10:09 2134次阅读

    Python怎么玩转JS脚本

    本项目旨在让大家了解如何用Python来执行JS脚本,其主要目的是在进行数据 分析时,需要利用爬虫获取数据,有时会遇到JS混淆加密反爬取难点,此时我们需 要获取网页JS加密代码将其
    的头像 发表于 02-23 16:26 1118次阅读
    <b class='flag-5'>Python</b>怎么玩转<b class='flag-5'>JS</b>脚本

    如何破解JS加密?

    学习爬虫最难之一无非就是如何破解JS加密,但是关于JS加密的网上资料非常零散杂乱,本人对这方面也略有研究,本篇文章在之前两篇文章[Python玩转JS脚本]
    的头像 发表于 02-24 14:57 2059次阅读
    如何破解<b class='flag-5'>JS</b>加密?

    python定义函数与调用函数的顺序

    定义函数与调用函数的顺序 函数被定义后,本身是不会自动执行的,只有在被调用后,函数才会被执行,得到相应的结果。但是在 Python 中我们要注意一个关键点,就是Python不允许前向引
    的头像 发表于 10-04 17:17 1393次阅读

    Python环境搭建和LabVIEW中的调用

    本文主要介绍Python相关的环境搭建、Anaconda的使用以及在LabVIEW中调用Python的方法。
    的头像 发表于 10-13 17:56 3143次阅读
    <b class='flag-5'>Python</b>环境搭建和LabVIEW中的<b class='flag-5'>调用</b>

    Aardio的基本用法及调用 Python 脚本的具体流程

    应用,推荐使用 Aardio + Python 搭配的方式进行开发 2. Aardio 介绍 Aardio 是一款专注于 Windows 桌面端的软件开发,适用于快速开发一些自用的 PC 端桌面工具,并且它
    的头像 发表于 10-31 10:30 6306次阅读
    Aardio的基本用法及<b class='flag-5'>调用</b> <b class='flag-5'>Python</b> 脚本的具体流程

    Python列表去重的4方式

    列表去重是Python中一常见的处理方式,任何编程场景都可能会遇到需要列表去重的情况。 列表去重的方式有很多,本文将一一讲解他们,并进行性能的对比。 让我们先制造一些简单的数据,生成
    的头像 发表于 11-02 10:46 1403次阅读
    <b class='flag-5'>Python</b>列表去重的<b class='flag-5'>4</b><b class='flag-5'>种</b><b class='flag-5'>方式</b>

    利用Python发送邮件的 3 方式

    Python 发送邮件的 3 方式 2. 准备 以 126 邮箱为例,在编码之前,我们需要开启 SMTP 服务 然后,手动新增一个授权码 其中,账号、授权码和服务器地址用于连接登录邮箱服务器 3.
    的头像 发表于 11-02 11:37 967次阅读

    python调用windows命令

    Python是一强大的编程语言,可以用于开发各种不同类型的应用程序。其中一个常见的用途是使用Python调用Windows命令来执行特定的任务。在本文中,我们将详细讨论如何使用
    的头像 发表于 11-29 14:34 1049次阅读

    python训练出的模型怎么调用

    Python中,训练出的模型可以通过多种方式进行调用。 1. 模型保存与加载 在Python中,训练好的模型需要被保存,以便在其他程序或会话中使用。以下是一些常用的模型保存和加载方法
    的头像 发表于 07-11 10:15 1916次阅读