【学习心得】Python调用JS的三种常用方法

本文探讨了三种在Python中执行和处理JavaScript的方法:pyexecjs用于在内存中执行纯JavaScript,selenium则模拟浏览器环境处理DOM和WebAPI,而Node.jsAPI允许通过HTTP接口调用JavaScript。每种方法各有优缺点,适用于不同的场景需求。
摘要由CSDN通过智能技术生成

        在做JS逆向的时候,一种情况是直接用Python代码复现JS代码的功能,达成目的。但很多时候这种方法有明显的缺点,那就是一旦JS代码逻辑发生了更改,你就得重写Python的代码逻辑非常不便。于是第二种情况就出现了,我直接得到你的JS代码片段,用Python去操作JS运行,并得到结果。这种做法的好处在于可以将JS代码看成一个黑盒子,我不关心里面是怎么写的,我只在乎是否输出了正确的结果。

方法一、用Python的pyexecjs库

pyexecjs库允许在Python环境中执行JavaScript代码,无需浏览器环境。在我的另一篇文章中详细讲了pyexecjs库的用法,大家可以去看看哦!

http://t.csdnimg.cn/Eo29Dicon-default.png?t=N7T8http://xn--pythonpyexecjs-082ha0760esa4358l6pybfnik9rvpff4ap62eee2q

优点:

  • 简单易用,无需启动浏览器环境即可执行JavaScript代码。
  • 在内存中执行JavaScript代码,性能相对较高。

缺点:

  • 只能执行纯JavaScript代码,无法处理DOM操作或者利用浏览器特性的功能(如Web API、HTML5特性等)。
  • 需要系统安装支持的JavaScript运行时环境(如Node.js或Rhino等)。
  • 对于复杂或依赖特定环境的JavaScript代码支持有限。

方法二、Python的selenium库

        selenium主要用于Web自动化测试,它可以启动一个真实的浏览器(如Chrome、Firefox等)并模拟用户操作。若要执行JavaScript代码,可以利用execute_script方法。至于如何使用execute_script我这里给出一段参考的代码:

# 导入webdriver模块中的Options类(这里省略了import语句)
chrome_option = Options()

# 设置Chrome浏览器启动选项,使其在无头模式下运行,即不显示用户界面
chrome_option.add_argument("--headless")

# 禁用GPU硬件加速,这对于某些系统在headless模式下运行时是必要的
chrome_option.add_argument("--disable-gpu")

# 忽略SSL证书错误,防止因为证书问题导致的网页加载失败
chrome_option.add_argument('--ignore-certificate-errors')

# 使用前面设置好的Chrome启动选项实例化一个Chrome浏览器对象
browser = webdriver.Chrome(options=chrome_option)

# 定义要访问的网址,并使用浏览器打开该网址
url = "替换成你想要处理的网址"
browser.get(url)

# 在当前页面上执行一段JavaScript代码,并获取其返回结果
result = browser.execute_script("你想执行的JS代码片段")

# 输出执行JavaScript后得到的结果
print(result)

# 暂停程序运行10秒,确保有足够时间进行页面加载或执行后续操作
time.sleep(10)

# 关闭并退出浏览器
browser.quit()

优点:

  • 真实的模拟浏览器环境执行JavaScript代码,因此能够处理与DOM相关的操作,以及调用浏览器提供的所有Web API和HTML5特性。
  • 适用于网页自动化测试和爬虫开发等场景,对网页动态加载内容有良好的支持。

缺点:

  • 执行速度相比直接在内存中执行JavaScript慢,因为需要启动和控制一个完整的浏览器实例。
  • 使用成本相对较高,需要配置对应的浏览器驱动程序。
  • 若只是简单的JavaScript计算任务,使用selenium显得较为笨重。

方法三、用node.js搭建一个HTTP API后台服务接口,开放给Python代码调用

        首先,在Node.js中创建一个HTTP服务器,并暴露执行JavaScript功能的API。然后,在Python中调用这个HTTP API来执行JavaScript代码下面介绍Node.js中的一个包express,他可以快速的搭建一个Web服务。

// 导入express包
const express = require("express")

// 创建Web实例
const app =  express()

// 设置端口
const port = 3000


// 处理GET请求
app.get('/', function (req, res){
    // 获取请求参数
    let params = req.query   // 获得整个请求参数
    let key = req.query.key  // 获得某个请求参数,这个key是我从前端自己传入的http://localhost:3000/?key=100
    // 返回响应
    res.send(`Your query params = ${key}`)
})


// 处理POST请求
// 先设置中间件
app.use(express.json())  // 用于解析JSON格式的请求体
app.post('/', function (req, res) {
    // 获取表单数据
    let data = req.body  // 获得整个表单数据
    let name = req.body.name  // 获得某个表单数据,这个name是我自己从前端传入的{"name": "wangxin", "age": 18}
    // 返回响应
    res.send(`Your form data = ${name}`)
})


// 启动服务
app.listen(port, function (){
    console.log(`Server is running at http://localhost:${port}`)
})

优点:

  • 提供了一种跨语言交互的解决方案,Python可以通过HTTP请求调用Node.js服务端的JavaScript代码,灵活性较强。
  • Node.js服务可以封装复杂的JavaScript逻辑,并进行优化和安全控制,提供给Python或其他客户端调用。
  • 可以复用已有的JavaScript模块和生态系统

缺点:

  • 需要额外搭建并维护一个HTTP服务,增加了系统的复杂性和部署成本。
  • HTTP请求存在网络延迟,不适合对响应时间要求极高的场景
  • 如果API设计不当或未做足够的安全性验证,可能带来安全风险。例如,在上述示例中直接执行用户提供的JavaScript代码是极其危险的,应避免在生产环境中这样做。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值