序言
平时 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