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

歡迎訪問 生活随笔!

生活随笔

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

javascript

Python之调用JS的方式

發布時間:2024/5/28 javascript 65 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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()方法,參數為23 # 方法名:add # 參數:23 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 # 參數:12 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的方式的全部內容,希望文章能夠幫你解決所遇到的問題。

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