
如果你想学WEB爬虫,有必要了解下。 毕竟现在很多网站需要解决JS逆向。
PyMiniRacer 是一个基于Google V8引擎的Python库,能将JavaScript代码嵌入到Python环境中执行。它轻量、高效,支持现代JS语法(如ES6、Promise),还能实现Python与JS的数据交互。
核心价值:
只需几行代码,即可在Python中运行JavaScript:
from py_mini_racer import MiniRacer
ctx = MiniRacer()
result = ctx.eval('1 + 1') # 输出:2
ctx.eval('function add(a,b) {return a+b;}')
print(ctx.eval('add(3,5)')) # 输出:8
Python对象可直接传递给JS,反之亦然:
# Python传字典给JS
ctx.eval(f"var obj = { {'name': 'Tom'} };")
print(ctx.eval("obj.name")) # 输出:"Tom"
# JS数组返回到Python转为列表
js_arr = ctx.eval("[1,2,3]")
print(js_arr[]) # 输出:1
处理JS异步操作毫无压力:
# 执行Promise并异步等待结果
asyncdefdemo():
promise = ctx.eval("new Promise(res => setTimeout(() => res(42), 1000))")
returnawait promise
print(asyncio.run(demo())) # 1秒后输出:42
避免恶意代码拖垮系统:
# 设置超时和内存限制
ctx = MiniRacer(timeout=, max_memory= * ) # 1秒超时,1MB内存
try:
ctx.eval('while(true){}') # 触发超时异常
except JSTimeoutException:
print("执行超时!")
直接使用JS库(如Lodash、加密算法):
# 调用JS的字符串处理库
ctx.eval('''
function reverse(str) {
return str.split('').reverse().join('');
}
''')
print(ctx.eval('reverse("hello")')) # 输出:"olleh"
破解前端加密参数(如某电商网站的签名算法):
# 执行前端加密函数
ctx.eval(open('encrypt.js').read())
sign = ctx.eval(f'generateSign("{params}")')
验证前端逻辑在后端的一致性:
# 模拟浏览器计算
ctx.eval('''
function calcPrice(price, discount) {
return price * (1 - discount);
}
''')
assert ctx.eval('calcPrice(100,0.2)') ==
避免重复造轮子,直接调用JS工具函数:
# 使用JS的日期格式化库
ctx.eval('''
function formatDate(date) {
return new Date(date).toISOString().split('T')[0];
}
''')
print(ctx.eval('formatDate("2025-05-26")')) # 输出:"2025-05-26"
处理JSON时兼顾两种语言的优势:
# JS处理复杂JSON,Python分析结果
ctx.eval('var data = JSON.parse(`{"sales": [158, 209, 305]}`);')
total_sales = ctx.eval('data.sales.reduce((a,b) => a+b, 0)')
print(total_sales) # 输出:672
与传统方案(如PyExecJS)相比,PyMiniRacer优势显著:
对比项 | PyMiniRacer | PyExecJS |
|---|---|---|
执行速度 | V8引擎编译执行,毫秒级响应 | 解释执行,速度慢10倍+ |
环境持久化 | 支持(变量可跨调用保留) | 每次调用重置环境 |
现代语法支持 | ES6、Promise、箭头函数 | 仅支持基础JS |
安全性 | 内存/超时管控 | 无 |
pip install py-mini-racer
MiniRacer实例)undefined和语法错误ctx对象null在Python中转为None