本篇内容介绍了“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