当前位置: 首页 > 后端技术 > Python

最全总结~说说Python调用JS的几种方法

时间:2023-03-26 19:06:28 Python

一、前言在日常的网页爬取过程中,我们经常会遇到参数被加密的场景。因此,我们需要对网页的源代码进行分析,通过调试逐层剥离出关键的JS代码,并使用Python来执行这段代码。参数加密前后的Python实现本文将讲4种使用Python调用JS的方法2.准备以一个简单的JS脚本为例,将代码写入文件//norm.js中。andfunctionadd(num1,num2){returnnum1+num2;}其中,定义了一个方法来计算两个数的和3.方法一:PyExecJSPyExecJS是使用最多的方法,底层实现方法是:在localJS在环境中运行JS代码支持的JS环境包括:Node.js、PyV8、PhantomJS、Nashorn等。首先,我们需要安装依赖包PyExecJS//py_exec_js_demo.py//安装依赖pip3installPyExecJS然后,阅读来自JS文件的源代码defjs_from_file(file_name):"""Readjsfile:return:"""withopen(file_name,'r',encoding='UTF-8')asfile:result=file.read()返回结果最后,使用execjs类的compile()方法编译加载上面的js字符串,返回一个context对象importexecjsfromjs_codeimport*#编译加载js字符串context1=execjs.compile(js_from_file('./norm.js'))最后调用上下文对象的call()方法执行JS方法。参数包括:JS代码要调用的方法名,以及对应方法的传入参数。#在js代码中调用add()方法,参数为2和3#方法名:add#参数:2和3result1=context1.call("add",2,3)print(result1)需要支付注意,因为PyExecJS在本地JS中运行环境,使用前会先启动JS环境,最终运行速度变慢。依赖库#安装依赖库pip3installjs2py然后使用js2py中的EvalJs()方法生成context对象#使用上下js2py生成context环境context=js2py.EvalJs()然后使用context对象来执行JS脚本并转成Python代码#执行整个JS代码context.execute(js_content)最后使用context调用JS中的方法并指定入参#使用context上下文调用具体函数#函数名:add#参数:1,2result=context.add(1,2)print(result)需要注意的是,如果JS是一段很长的混淆代码,转换成Python的过程可能会报错5.方法三:Node.js其实是使用Python的os.popen来执行node命令,执行JS脚本首先确保本地已经安装了Node.js环境修改JS脚本,增加一个导出函数init方便调用内部函数//计算两数之和functionadd(num1,num2){returnnum1+num2;}//添加一个新的导出函数(节点模式)module.exports.init=function(arg1,arg2){//调用函数并返回console.log(add(arg1,arg2));};然后,把调用JS方法的命令组成一个字符串#组成调用js方法的命令#nodecommand:node-ecmd='node-e"require(\"%s\").init(%s,%s)"'%('./norm',3,5)最后通过os.popen执行命令pipeline=os.popen(cmd)#读取结果result=pipeline.read()print('结果为:',结果)6。方法四:PyV8PyV8是谷歌已经将ChromeV8引擎用Python打包为依赖库。不依赖本地JS环境,运行速度非常快。importPyV8fromjs_codeimportjs_from_filewithPyV8.JSContext()asctx:ctx.eval(js_from_file('./norm.js'))#调用js函数并指定参数ctx.locals.add(1,2)但重复后测试,发现在Python3环境下在MAC和PC上使用PyV8会报各种奇怪的问题,所以不推荐使用!7、最后总结了上面Python调用JS的4种方式。在实际的爬虫项目中,一般会先使用node命令进行测试,确保没有问题,然后使用前3种方式中的任意一种来重写Python。这是我们文章的结尾。如果喜欢今天的Python实战教程,请关注公众号:Python编程学习圈,或前往:编程学习网了解更多编程技巧,获取海量学习资料!