python如何调用js

  介绍

本篇内容介绍了“python如何调用js”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!

1。前言

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

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

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

2。准备

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

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

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

3。方式一:PyExecJS

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

//py_exec_js_demo.py//安装依赖   pip3  install  PyExecJS

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

def  js_from_file (file_name):   ,,,,,,   ,,,读取js文件   ,,,:返回:   ,,,,,,   ,,,with 开放(file_name, & # 39; " # 39;,,编码=& # 39;utf - 8 # 39;), as 文件:   ,,,,,,,result =,以()      ,,,return 结果

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

import  execjs      得到js_code  import  *      #,编译加载js字符串   context1 =, execjs.compile (js_from_file (& # 39;。/norm.js& # 39;))

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

#,调用JS代码中的添加()方法,参数为2和3   #,方法名:添加   #,参数:2和3   时间=result1  context1.call (“add",, 2,, 3)      打印(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中的方法,并制定输入参数即可

#,使用上下文背景调用具体的函数   #,函数名:添加   #,参数:1、2   时间=result  context.add (1, 2)   print(结果)

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

更多功能可以参考:https://github.com/PiotrDabkowski/Js2Py

5。方式三:节点。js

实际上是使用Python的操作系统。popen执行节点命令,执行JS脚本

首先,确保本地已经安装了节点。js环境

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

//计算两个数的和   function 添加(num1, num2), {   ,,,return  num1  +, num2;   }//新增一个导出函数(节点方式)   时间=module.exports.init  function  (__arg1、,最长),{   ,,,//调用函数,并返回   ,,,console.log(添加(__arg1、,最长));   };

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

#,组成调用js的命令   #,节点命令:node  - e=cmd  & # 39; node  -e “要求(\ \“% s \ \“) .init (%, % s)“& # 39;, %,(& # 39;。/规范# 39;,,3,,5)

最后,通过操作系统。popen执行命令即可

pipeline =, os.popen (cmd)      #,读取结果   时间=result  pipeline.read ()      打印(& # 39;结果是:& # 39;,,结果)

6。方式四:PyV8

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

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

import  PyV8   得到js_code  import  js_from_file      with  PyV8.JSContext (), as  ctx:   ,,,ctx.eval (js_from_file (& # 39;。/norm.js& # 39;))      #,调用js函数,指定参数   ctx.locals.add (1, 2)

python如何调用js