日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 前端技术 > javascript >内容正文

javascript

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

發布時間:2025/3/15 javascript 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 聊聊 Python 调用 JS 的几种方式,你都知道吗? 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

1. 前言

日常 Web 端爬蟲過程中,經常會遇到參數被加密的場景,因此,我們需要分析網頁源代碼

通過調式,一層層剝離出關鍵的 JS 代碼,使用 Python 去執行這段代碼,得出參數加密前后的 Python 實現

本文將聊聊利用 Python 調用 JS 的4種方式

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?execjsfrom?js_code?import?*#?編譯加載js字符串context1?=?execjs.compile(js_from_file('./norm.js'))

最后,調用上下文對象的call() 方法執行 JS 方法

其中,參數包含:JS 代碼被調的方法名、對應方法的傳入參數

#?調用js代碼中的add()方法,參數為2和3#?方法名:add#?參數:2和3result1?=?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,2result?=?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 -ecmd?=?'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?PyV8from?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 會報各種奇怪的問題,所以不推薦使用!如果大家對Python感興趣的話,可以加一下我的薇信哦:abb436574,免費領取一套學習資料和視頻課程喲~

更多功能可以參考:

https://github.com/emmetio/pyv8-binaries

7. 最后

上面總結了 Python 調用 JS 的 4 種方式

實際爬蟲項目中,一般會先使用 node 命令進行一次測試,確保沒問題后,再使用前 3 種方式的任意一種進行 Python 改寫

總結

以上是生活随笔為你收集整理的聊聊 Python 调用 JS 的几种方式,你都知道吗?的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。