序言

平时 Web 端网络爬虫全过程中 ,常常会碰到参数被数据加密的情景 ,因而,大家必须剖析网页页面源代码

根据调式,一层层脱离出重要的 JS 代码 ,应用 Python 去实行这一段代码,得到参数数据加密前后左右的 Python 完成

文中将聊一聊利用 Python 调用 JS 的4种方法

PS:若有必须Python学习材料的小伙伴们能够加正下方的群去找完全免费管理人员领到

 

2. 提前准备

以一段简易的 JS 脚本制作为例子,将代码载入到文档中

//norm.js //测算两个数的和 function add(num1, num2) {     return num1   num2; }

在其中 ,界定了一个方法,测算两个数的和

3. 方法一:PyExecJS

PyExecJS 是应用数最多的一种方法,最底层完成方法是:在当地 JS 环境下运作 JS 代码

适用的 JS 环境包括:Node.js 、PyV8 、PhantomJS、Nashorn 等

最先 ,大家必须安裝依赖包 PyExecJS

//py_exec_js_demo.py //安裝依靠 pip3 install PyExecJS

随后,从 JS 文档中载入源代码

def js_from_file(file_name):     """     载入js文件     :return:     """     with open(file_name, 'r', encoding='UTF-8') as file:         result = file.read()     return result

最终,应用 execjs 类的compile()方法编译程序载入上边的 JS 字符串数组 ,回到一个前后文目标

import execjs from js_code import * # 编译程序载入js字符串 context1 = execjs.compile(js_from_file('./norm.js'))

最终,调用前后文目标的call() 方法实行 JS 方法

在其中,参数包括:JS 代码被调的方法名、相匹配方法的传到参数

# 调用js代码中的add()方法 ,参数为2和3 # 方法名:add # 参数:2和3 result1 = context1.call("add", 2, 3) print(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 中的方法,并制订键入参数就可以

# 应用前后文context调用实际的涵数 # 涵数名:add # 参数:1 ,2 result = context.add(1, 2) print(result)

必须留意是,假如 JS 是较长的搞混代码,变换为 Python 的全过程很有可能会出错

更智能能够参照:

https://github.com/PiotrDabkowski/Js2Py

5. 方法三:Node.js

事实上是应用 Python 的os.popen实行 node 指令 ,实行 JS 脚本制作

最先,保证当地早已安裝了 Node.js 环境

改动 JS 脚本制作,增加一个导出来涵数 init  ,便捷內部涵数被调用

//测算两个数的和 function add(num1, num2) {     return num1   num2; } //增加一个导出来涵数(node方法) module.exports.init = function (arg1, arg2) {     //调用涵数 ,并回到     console.log(add(arg1, arg2)); };

随后,将调用 JS 方法的指令构成一个字符串数组

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

最终,根据 os.popen 运行命令就可以

pipeline = os.popen(cmd) # 载入結果 result = pipeline.read() print('結果是:', result)

6. 方法四:PyV8

PyV8 是 Google 将 Chrome V8 模块用 Python 封裝的依靠库

它不依靠当地 JS 环境 ,运作速率迅速

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

可是历经不断检测发觉,MAC 和 PC 在 Python3 环境下 ,应用 PyV8 会报各种各样奇怪的问题,因此 不强烈推荐应用!

文中的文本及图片来自互联网,仅作学习培训 、沟通交流应用,不具备一切商业行为,著作权归著作人全部,如不太好请立即在线留言以作解决。

创作者:星安果

文章来源于网络,如有侵权请联系站长QQ61910465删除
本文版权归趣快排营销www.seoguRubloG.com 所有,如有转发请注明来出,竞价开户托管,seo优化请联系✚Qq61910465