一、前言

  • 日常 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的方式相关推荐

  1. 在python中调用js或者nodejs要使用PyExecJs第三方包。

    在python中调用js或者nodejs要使用PyExecJs第三方包. 使用时:import execjs 这是没有用到nodejs的情况:如果用到nodejs,这种写法会报"Cannot ...

  2. python 爬虫调用 js 的库之 execjs

    python 爬虫调用 js 的库之 execjs 针对现在大部分的网站都是使用 js 加密,js 加载的,并不能直接抓取出来,这时候就不得不使用一些三方类库来执行 js 语句 1. 安装 pip i ...

  3. python selenium --调用js

    转自:http://www.cnblogs.com/fnng/p/3230768.html 本节重点: 调用js方法 execute_script(script, *args) 在当前窗口/框架 同步 ...

  4. python判断网页密码加密方式_python实现网页登录时的rsa加密流程

    对某些网站的登录包进行抓包时发现,客户端对用户名进行了加密,然后传给服务器进行校验. 使用chrome调试功能断点调试,发现网站用javascript对用户名做了rsa加密. 为了实现网站的自动登录, ...

  5. 聊聊 Python 调用 JS 的几种方式,你都知道吗?

    1. 前言 日常 Web 端爬虫过程中,经常会遇到参数被加密的场景,因此,我们需要分析网页源代码 通过调式,一层层剥离出关键的 JS 代码,使用 Python 去执行这段代码,得出参数加密前后的 Py ...

  6. python 调用js类_Python 调用 JS 常用的4种方式,带你学会如何解密

    本文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理 以下文章来源于AirPython ,作者星安果 1. 前言 日常 Web 端爬虫过 ...

  7. python调用js接口_最全总结!聊聊 Python 调用 JS 的几种方式

    原标题:最全总结!聊聊 Python 调用 JS 的几种方式 作者 | 星安果 来源 | AirPython 1. 前言 日常 Web 端爬虫过程中,经常会遇到参数被加密的场景,因此,我们需要分析网页 ...

  8. Python 调用 JS 的几种方式

    前言 日常 Web 端爬虫过程中,经常会遇到参数被加密的场景,因此,我们需要分析网页源代码 通过调式,一层层剥离出关键的 JS 代码,使用 Python 去执行这段代码,得出参数加密前后的 Pytho ...

  9. JS 逆向的时候 Python 如何调用 JavaScript 代码?「建议收藏哦!」

    你好,我是悦创.关注公众号:AI悦创,抢先阅读优质文章. 公众号原文:https://mp.weixin.qq.com/s/PYEiSMgP2LT0DmcHX08PCw 博客原文:https://ww ...

最新文章

  1. 让CentOS 5.5支持ext4
  2. 计算机技术综合应用,浅谈计算机技术综合应用能力培养.pdf
  3. docker-maven-plugin的pom配置
  4. DCOS实践分享(6):基于DCOS的大数据应用分享
  5. 高级SmartGWT教程,第1部分
  6. Android开发笔记(九十七)图片的特效处理
  7. hive报错(1)MoveTask
  8. 怎么在alert里加图片_麻辣烫里加牛奶,创意吃法,麻辣鲜香吃得超过瘾
  9. thinkphp的model模型的设计经验总结
  10. 第 2 讲 初识 SLAM
  11. app用http3与服务器_mqtt服务器搭建以及客户端Paho安装使用
  12. 教你用报表工具搭建企业考核系统
  13. Java数组 排序算法和常见异常
  14. 计算机网络telnet命令作用,telnet命令使用方法详解
  15. Unity资源加载简析(二)AssetsBundle
  16. 2021 年 8 月全国程序员薪酬终于出炉了!北京以18904元位居榜首
  17. IntentService使用姿势
  18. pandoc下载 - 文档格式转换器
  19. python画三维(3D)图
  20. Artemis集群(18)

热门文章

  1. whois老域名挖掘技术
  2. RPC与其实现方式概念笔记
  3. mysql 字符类型
  4. List接口实现类-ArrayList、Vector、LinkedList集合深入学习以及源代码解析
  5. 常用脚本--查看数据库文件大小
  6. 开发HTML5手机游戏的5个注意要点--手机开发前景-- 转
  7. jq调用android方法,Android端JQueryMobile使用教程(一)
  8. Java黑皮书课后题第7章:*7.28(数学:组合)编写一个程序,提示用户输入10个整数,然后显示从这10个数中选出两个数的所有组合
  9. Java黑皮书课后题第5章:**5.7(金融应用:计算将来的学费)假设今年某大学的大学为10000美元,学费的年增长率为5%,一年后,学费将是10500美元。编写程序,计算10年后的学费,10~13费
  10. Java黑皮书课后题第3章:**3.4(随机月份)编写一个随机产生1和12之间整数的程序,并根据数组1,2,3...显示对应的月份