Python之调用JS的方式
一、前言
- 日常 Web 端爬虫过程中,经常会遇到参数被加密的场景,因此,我们需要分析网页源代码。通过调式,然后一层一层剥离出关键的 JS 代码,使用 Python 去执行这段代码,得出参数加密前后的 Python 实现。那么,Python 如何调用 JS 呢?有哪些方式呢?
- 以一段简单的 JS 脚本为例,其中定义了一个方法计算两个数的和,将代码写入到文件中:
// norm.js
// 计算两个数的和
function add(num1, num2) {return num1 + num2;
}
二、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 execjsfrom 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 环境,最终导致运行速度会偏慢。
- 更多功能,请参考:PyExecJS。
三、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 的过程可能会报错。
- 更多功能可以参考:Js2Py。
四、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)
五、PyV8
- PyV8 是 Google 将 Chrome V8 引擎用 Python 封装的依赖库,它不依赖本地 JS 环境,运行速度很快。
import PyV8
from js_code import js_from_filewith PyV8.JSContext() as ctx:ctx.eval(js_from_file('./norm.js'))# 调用js函数,指定参数
ctx.locals.add(1, 2)
- 经过反复测试发现,MAC 和 PC 在 Python3 环境下,使用 PyV8 会报各种奇怪的问题,所以不推荐使用。
- 更多功能可以参考:pyv8-binaries。
Python之调用JS的方式相关推荐
- 在python中调用js或者nodejs要使用PyExecJs第三方包。
在python中调用js或者nodejs要使用PyExecJs第三方包. 使用时:import execjs 这是没有用到nodejs的情况:如果用到nodejs,这种写法会报"Cannot ...
- python 爬虫调用 js 的库之 execjs
python 爬虫调用 js 的库之 execjs 针对现在大部分的网站都是使用 js 加密,js 加载的,并不能直接抓取出来,这时候就不得不使用一些三方类库来执行 js 语句 1. 安装 pip i ...
- python selenium --调用js
转自:http://www.cnblogs.com/fnng/p/3230768.html 本节重点: 调用js方法 execute_script(script, *args) 在当前窗口/框架 同步 ...
- python判断网页密码加密方式_python实现网页登录时的rsa加密流程
对某些网站的登录包进行抓包时发现,客户端对用户名进行了加密,然后传给服务器进行校验. 使用chrome调试功能断点调试,发现网站用javascript对用户名做了rsa加密. 为了实现网站的自动登录, ...
- 聊聊 Python 调用 JS 的几种方式,你都知道吗?
1. 前言 日常 Web 端爬虫过程中,经常会遇到参数被加密的场景,因此,我们需要分析网页源代码 通过调式,一层层剥离出关键的 JS 代码,使用 Python 去执行这段代码,得出参数加密前后的 Py ...
- python 调用js类_Python 调用 JS 常用的4种方式,带你学会如何解密
本文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理 以下文章来源于AirPython ,作者星安果 1. 前言 日常 Web 端爬虫过 ...
- python调用js接口_最全总结!聊聊 Python 调用 JS 的几种方式
原标题:最全总结!聊聊 Python 调用 JS 的几种方式 作者 | 星安果 来源 | AirPython 1. 前言 日常 Web 端爬虫过程中,经常会遇到参数被加密的场景,因此,我们需要分析网页 ...
- Python 调用 JS 的几种方式
前言 日常 Web 端爬虫过程中,经常会遇到参数被加密的场景,因此,我们需要分析网页源代码 通过调式,一层层剥离出关键的 JS 代码,使用 Python 去执行这段代码,得出参数加密前后的 Pytho ...
- JS 逆向的时候 Python 如何调用 JavaScript 代码?「建议收藏哦!」
你好,我是悦创.关注公众号:AI悦创,抢先阅读优质文章. 公众号原文:https://mp.weixin.qq.com/s/PYEiSMgP2LT0DmcHX08PCw 博客原文:https://ww ...
最新文章
- 让CentOS 5.5支持ext4
- 计算机技术综合应用,浅谈计算机技术综合应用能力培养.pdf
- docker-maven-plugin的pom配置
- DCOS实践分享(6):基于DCOS的大数据应用分享
- 高级SmartGWT教程,第1部分
- Android开发笔记(九十七)图片的特效处理
- hive报错(1)MoveTask
- 怎么在alert里加图片_麻辣烫里加牛奶,创意吃法,麻辣鲜香吃得超过瘾
- thinkphp的model模型的设计经验总结
- 第 2 讲 初识 SLAM
- app用http3与服务器_mqtt服务器搭建以及客户端Paho安装使用
- 教你用报表工具搭建企业考核系统
- Java数组 排序算法和常见异常
- 计算机网络telnet命令作用,telnet命令使用方法详解
- Unity资源加载简析(二)AssetsBundle
- 2021 年 8 月全国程序员薪酬终于出炉了!北京以18904元位居榜首
- IntentService使用姿势
- pandoc下载 - 文档格式转换器
- python画三维(3D)图
- Artemis集群(18)
热门文章
- whois老域名挖掘技术
- RPC与其实现方式概念笔记
- mysql 字符类型
- List接口实现类-ArrayList、Vector、LinkedList集合深入学习以及源代码解析
- 常用脚本--查看数据库文件大小
- 开发HTML5手机游戏的5个注意要点--手机开发前景-- 转
- jq调用android方法,Android端JQueryMobile使用教程(一)
- Java黑皮书课后题第7章:*7.28(数学:组合)编写一个程序,提示用户输入10个整数,然后显示从这10个数中选出两个数的所有组合
- Java黑皮书课后题第5章:**5.7(金融应用:计算将来的学费)假设今年某大学的大学为10000美元,学费的年增长率为5%,一年后,学费将是10500美元。编写程序,计算10年后的学费,10~13费
- Java黑皮书课后题第3章:**3.4(随机月份)编写一个随机产生1和12之间整数的程序,并根据数组1,2,3...显示对应的月份