python 调用js的四种方式
创始人
2024-05-30 14:43:15
0

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 的过程可能会报错

更多功能可以参考:

GitHub - PiotrDabkowski/Js2Py: JavaScript to Python Translator & JavaScript interpreter written in 100% pure Python🚀 Try it online:

5. 方式三:Node.js

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

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

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

 
  1. //计算两个数的和
  2. function add(num1, num2) {
  3.     return num1 + num2;
  4. }
  5. //新增一个导出函数(node方式)
  6. module.exports.init = function (arg1, arg2) {
  7.     //调用函数,并返回
  8.     console.log(add(arg1, arg2));
  9. };

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

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

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

 
  1. pipeline = os.popen(cmd)
  2. # 读取结果
  3. result = pipeline.read()
  4. print('结果是:', result)

6. 方式四:PyV8

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

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

 
  1. import PyV8
  2. from js_code import js_from_file
  3. with PyV8.JSContext() as ctx:
  4.     ctx.eval(js_from_file('./norm.js'))
  5. # 调用js函数,指定参数
  6. ctx.locals.add(1, 2)

更多功能可以参考:

GitHub - emmetio/pyv8-binaries: Archive of pre-compiled PyV8 binaries

7. 最后

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

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

示例代码地址:tools_python/Python执行JS总结 at master · xingag/tools_python · GitHub

相关内容

热门资讯

安卓和小米系统怎么换机,轻松实... 你有没有想过,手机用久了,是不是有点腻味了呢?想要换一台新手机,但是又不知道怎么从安卓系统切换到小米...
安卓最好的系统软件,揭秘最佳系... 你有没有想过,为什么你的安卓手机总是那么流畅,那么好玩?这背后,可离不开那些默默无闻的系统软件呢!今...
安卓系统屏幕如何截屏,安卓屏幕... 亲爱的手机控们,你是不是也经常想要截取手机屏幕上的精彩瞬间呢?别急,今天就来手把手教你如何轻松截屏,...
安卓系统为何总会卡顿,性能优化... 你有没有发现,不管你的安卓手机多新,用不了多久就会变得卡顿呢?这可真是让人头疼的问题。今天,我们就来...
手机适配高版本安卓系统,揭秘高... 你有没有发现,最近你的手机好像变得越来越不给力了?是不是觉得打开某个应用时总是卡顿,或者某些功能突然...
苹果和安卓系统原理,架构、差异... 你有没有想过,为什么你的手机里装了那么多应用,却还是觉得不够用?其实,这一切都离不开我们每天离不开的...
小米2s双系统安卓系统 你有没有想过,一部手机,竟然能同时拥有两个操作系统?没错,就是那种可以让你在安卓和另一个系统之间自由...
王者荣耀什么是安卓系统,畅享手... 亲爱的王者荣耀玩家们,你是否曾好奇过,这款火爆全网的手机游戏,究竟是如何在安卓系统上运行得如此流畅呢...
百度系统和安卓系统区别,差异解... 你有没有想过,为什么你的手机里装的是安卓系统,而朋友的手机却是百度系统呢?这两种系统各有千秋,今天就...
旧安卓刷鸿蒙系统教程,刷鸿蒙系... 亲爱的安卓用户们,你是否对鸿蒙系统心生向往,想要让你的旧安卓手机也体验一番全新的操作系统呢?别急,今...
原生安卓系统如何换字体,轻松实... 你有没有发现,手机上的字体有时候看久了,眼睛都累得不行?别急,今天就来教你怎么给原生安卓系统换个新字...
安卓系统按键切歌 你有没有遇到过在听歌的时候,突然想切换到下一首,却发现按键操作起来有点麻烦?别急,今天就来给你详细介...
安卓系统买哪款耳机 你最近是不是在为安卓系统的新耳机犯愁呢?市面上那么多品牌,那么多型号,真是让人挑花了眼。别急,今天我...
安卓导航系统无响应,排查与解决... 最近是不是你也遇到了安卓导航系统无响应的尴尬情况?别急,让我来给你详细剖析一下这个问题,让你从此告别...
安卓系统进不去微信,安卓系统无... 最近是不是你也遇到了这样的烦恼:安卓手机突然进不去微信了?别急,让我来给你详细说说这个问题的原因和解...
安卓2代系统升级,跨越时代的飞... 你有没有发现,你的安卓手机最近是不是变得有点儿慢吞吞的?别急,别急,这可能是你的安卓2代系统需要升级...
安卓主屏换成苹果系统,体验全新... 你知道吗?最近有个朋友突然告诉我,他打算把安卓手机的主屏换成苹果系统的界面。这可真是让人眼前一亮的主...
安卓系统编程岗位要求 你有没有想过,为什么安卓系统这么受欢迎?没错,就是因为它强大、灵活,而且开发起来超级有趣!那么,想要...
安卓手机哪个系统没广告,揭秘无... 你有没有发现,用安卓手机的时候,广告总是无处不在,让人有点头疼呢?今天,就让我来给你揭秘安卓手机中哪...
安卓没电系统提示音,唤醒你的紧... 手机没电了,是不是瞬间感觉整个人都不好了?尤其是安卓手机,那系统提示音一响,简直就像是在耳边嗡嗡嗡地...