python 调用js的四种方式

2023-10-31

1. 前言

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

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

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

2. 准备

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

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

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

3. 方式一:PyExecJS

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

 
  1. //py_exec_js_demo.py
  2. //安装依赖
  3. pip3 install PyExecJS

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

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

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

 
  1. import execjs
  2. from js_code import *
  3. # 编译加载js字符串
  4. context1 = execjs.compile(js_from_file('./norm.js'))

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

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

需要注意的,由于 PyExecJS 运行在本地 JS 环境下,使用之前会启动 JS 环境,最终导致运行速度会偏慢
更多功能可以参考:
GitHub - doloopwhile/PyExecJS: Run JavaScript code from Python (EOL: https://gist.github.com/doloopwhile/8c6ec7dd4703e8a44e559411cb2ea221)

4. 方式二:js2py

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

首先,安装依赖库

 
  1. # 安装依赖库
  2. pip3 install js2py

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

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

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

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

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

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

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

更多功能可以参考:

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)


python 调用js的四种方式 的相关文章

随机推荐

  • 轻松玩转开源大语言模型bloom(一)

    前言 chatgpt已经成为了当下热门 github首页的trending排行榜上天天都有它的相关项目 但背后隐藏的却是openai公司提供的api收费服务 作为一名开源爱好者 我非常不喜欢知识付费或者服务收费的理念 所以便有决心写下此系列
  • Vue3最常见的10道面试题:含答案和代码示例的练习题

    本文列举了10道Vue3面试题 每道题都包含了答案和代码示例 希望对你的面试有所帮助 什么是Vue3 Vue3是Vue js的下一个主要版本 它带来了很多重要的改进和新功能 包括更快的渲染速度 更好的类型支持 更好的组合API等 什么是Co
  • Postman 如何调用文件上传下载接口

    文件导入导出是管理后台的通用功能 所以在接口写好后在没有前端页面使用Postman进行接口调用测试接口功能成为一个选择 导出 在我们输入接口地址 token等候 点击send 发现下载的成为了乱码 如下图 这明显不符合我们的预期期望 在se
  • 文本分析简历项目收集-----机器学习(仅供参考)

    文本分析 项目3 基于自然语言处理的影评分析 项目简介 通过大量的正面和负面的电影评论对计算机进行自然语言训练 实现计算机对电影评论的基本情感分析 使其能够快速判断出评论是否积极 个人职责 1 对正面和负面的电影评论进行分词处理 整理成规定
  • 一次让人难以忘怀的排查频繁Full GC过程

    我们的Java应用因频繁FULL GC导致性能降低很多 经过多人的定位也没有结论 于是我自主请命 经过一天的研究终于搞定了 现把经验与大家共享 相关的gc日志如下 4 758 Full GC PSYoungGen 464K gt 0K 71
  • linux统计一个文件中特定字符的个数

    统计一个文件中某个字符串的个数 其实就是在在一块沙地里面找石头 有的人看到石头以后 在上面做个标记 grep 然后记住自己做了多少个标记 有的 人看到石头以后 把它挖了 tr 最后统计自己挖了多少石头 有的人看到石头以后 把它跳过去 awk
  • STL:list的模拟实现(迭代器失效探讨)

    为什么重新设计list迭代器 对迭代器解引用 我们希望拿到的是指针所指向的值域 而直接解引用拿到的是指针所指向的节点 对list指针 和 迭代器 提供一种方法 使其能够按照顺序访问容器 聚合物 所含的各个元素 并且不用暴露容器内部的表述方式
  • 达芬奇15中文版

    教程 1 下载解压 得到davinci resolve 15原程序和文件 2 双击文件 DaVinci Resolve Studio 15 0b2 Windows exe 依提示安装原程序 3 达芬奇软件需要安装必要的组件 一般按默认安装即
  • Flexible弹性布局

    flex布局 弹性布局 flex的两个重要概念 开启了flex布局的元素叫flex container display flex inline flex flex container 里面的直接子元素叫做 flex items flex布局
  • 来源查询检索的研究

    来源查询检索的研究 来源查询的方式主要有 基于内容索引的查询 gt 基于时间局部性的上下文增强搜索查询 gt 基于因果关系的查询 根据provenance提供上下文有关的索引 即因果关系 1 传统的来源查询检索方式为基于内容索引的查询 在这
  • 阿里云视频点播文件上传-iOS

    文章目录 阿里云视频点播文件上传 iOS 一 上传方式 方式一 上传地址加凭证上传 1 请求AppServer 2 在start的回调中设置上传地址和上传凭证 3 uploadAuth过期重新设置 4 上传图片和上传视频 方式二 STS方式
  • 记一次线上CPU持续飙升的问题排查

    最近公司的事务多了很多 都很少有时间来更新了 上周六项目上刚刚发生了一次CPU持续飙高 导致服务不可用的线上事故 在此也简单做下记录 问题排查的过程大概是这样的 查看业务日志中最开始报错的信息 发现数据库连接超时 redis也连接超时 而且
  • 嵌入式实践——烟雾产生器

    开发工具 Altium Designer 2020 STM32CubeMX 5 3 0 MDK ARM 5 28 1 设计需求 设计出一套完整的烟雾产生装置 该装置通过按钮来控制烟雾的产生和关闭 装置对体积要求较高 所以控制板需控制在4cm
  • WPF 文本框错误验证 Validation.ErrorTemplate

    前端 1 错误模板ValidationContent xaml
  • 智能算法系列之粒子群优化算法

    本博客封面由ChatGPT DALL E 2共同创作而成 文章目录 前言 1 算法思想 2 细节梳理 2 1 超参数的选择 2 2 一些trick 3 算法实现 3 1 问题场景 3 2 python实现 代码仓库 IALib GitHub
  • CTF做题总结(二)

    前言 最近这段时间在内部平台上做了一些Web题 和最基础的Reverse签到题 虽说还有两道Reverse题没做出来 但还是先总结一下吧 Web1 BASE INJECT 看题目提示 就知道这道题之前做过 不过当时没总结 现在总结一下 题目
  • Latent Diffusion(CVPR2022 oral)-论文阅读

    文章目录 摘要 背景 算法 3 1 Perceptual Image Compression 3 2 Latent Diffusion Models 3 3 Conditioning Mechanisms 实验 4 1 On Percept
  • sql中in查不出数据怎么办?

    在写代码的时候突然想到一个问题 用in关键字查不出来东西怎么办 sql报错怎么办 我在生产环境中用了如下的代码 select from cons account where id in select cons id from meter w
  • img 转化成iso镜像的办法

    最近在使用KVM启用虚拟机 然后将里面的环境和配置 配置成我们公司需要的环境 再打包成iso镜像 之后再次生成新的虚拟机 但是KVM启动出的镜像生成的是img镜像 需要将img镜像转换成iso镜像 网上找了好多 比如imgtoiso 这个软
  • python 调用js的四种方式

    1 前言 日常 Web 端爬虫过程中 经常会遇到参数被加密的场景 因此 我们需要分析网页源代码 通过调式 一层层剥离出关键的 JS 代码 使用 Python 去执行这段代码 得出参数加密前后的 Python 实现 本文将聊聊利用 Pytho