主頁 > 知識庫 > python 調用js的四種方式

python 調用js的四種方式

熱門標簽:電話機器人貸款詐騙 看懂地圖標注方法 佛山通用400電話申請 電話外呼系統(tǒng)招商代理 京華圖書館地圖標注 廣東旅游地圖標注 打印谷歌地圖標注 蘇州人工外呼系統(tǒng)軟件 淮安呼叫中心外呼系統(tǒng)如何

1. 前言

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

通過調式,一層層剝離出關鍵的 JS 代碼,使用 Python 去執(zhí)行這段代碼,得出參數(shù)加密前后的 Python 實現(xiàn)

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

2. 準備

以一段簡單的 JS 腳本為例,將代碼寫入到文件中

//norm.js
//計算兩個數(shù)的和
function add(num1, num2) {
    return num1 + num2;
}

其中,定義了一個方法,計算兩個數(shù)的和

3. 方式一:PyExecJS

PyExecJS 是使用最多的一種方式,底層實現(xiàn)方式是:在本地 JS 環(huán)境下運行 JS 代碼
支持的 JS 環(huán)境包含: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 execjs

from js_code import *

# 編譯加載js字符串
context1 = execjs.compile(js_from_file('./norm.js'))

最后,調用上下文對象的call() 方法執(zhí)行 JS 方法
其中,參數(shù)包含:JS 代碼被調的方法名、對應方法的傳入參數(shù)

# 調用js代碼中的add()方法,參數(shù)為2和3
# 方法名:add
# 參數(shù):2和3
result1 = context1.call("add", 2, 3)

print(result1)

需要注意的,由于 PyExecJS 運行在本地 JS 環(huán)境下,使用之前會啟動 JS 環(huán)境,最終導致運行速度會偏慢
更多功能可以參考:
https://github.com/doloopwhile/PyExecJS

4. 方式二:js2py

js2py作為一個純 Python 實現(xiàn)的 JS 解釋器,可以完全脫離 JS 環(huán)境,直接將 JS 代碼轉換為 Python 代碼

首先,安裝依賴庫

# 安裝依賴庫
pip3 install js2py

然后使用 js2py 中的EvalJs()方法生成一個上下文對象

# 使用獲取上下js2py生成一個上下文環(huán)境
context = js2py.EvalJs()

接著利用上下文對象執(zhí)行 JS 腳本,轉換為 Python 代碼

# 執(zhí)行整段JS代碼
context.execute(js_content)

最后,利用上下文調用 JS 中的方法,并制定輸入參數(shù)即可

# 使用上下文context調用具體的函數(shù)
# 函數(shù)名:add
# 參數(shù):1,2
result = context.add(1, 2)
print(result)

需要注意是,如果 JS 是很長的混淆代碼,轉換為 Python 的過程可能會報錯

更多功能可以參考:

https://github.com/PiotrDabkowski/Js2Py

5. 方式三:Node.js

實際上是使用 Python 的os.popen執(zhí)行 node 命令,執(zhí)行 JS 腳本

首先,確保本地已經安裝了 Node.js 環(huán)境

修改 JS 腳本,新增一個導出函數(shù) init ,方便內部函數(shù)被調用

//計算兩個數(shù)的和
function add(num1, num2) {
    return num1 + num2;
}

//新增一個導出函數(shù)(node方式)
module.exports.init = function (arg1, arg2) {
    //調用函數(shù),并返回
    console.log(add(arg1, arg2));
};

然后,將調用 JS 方法的命令組成一個字符串

# 組成調用js的命令
# node命令:node -e
cmd = 'node -e "require(\\"%s\\").init(%s,%s)"' % ('./norm', 3, 5)

最后,通過 os.popen 執(zhí)行命令即可

pipeline = os.popen(cmd)

# 讀取結果
result = pipeline.read()

print('結果是:', result)

6. 方式四:PyV8

PyV8 是 Google 將 Chrome V8 引擎用 Python 封裝的依賴庫

它不依賴本地 JS 環(huán)境,運行速度很快

import PyV8
from js_code import js_from_file

with PyV8.JSContext() as ctx:
    ctx.eval(js_from_file('./norm.js'))

# 調用js函數(shù),指定參數(shù)
ctx.locals.add(1, 2)

更多功能可以參考:

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

7. 最后

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

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

示例代碼地址:https://github.com/xingag/tools_python/tree/master/Python%E6%89%A7%E8%A1%8CJS%E6%80%BB%E7%BB%93

以上就是python 調用js的四種方式的詳細內容,更多關于python 調用js的資料請關注腳本之家其它相關文章!

您可能感興趣的文章:
  • Python中json.dumps()函數(shù)的使用解析
  • python執(zhí)行js代碼的方法
  • Python如何把不同類型數(shù)據的json序列化
  • Python 如何保存json文件并格式化
  • Python實現(xiàn)學生管理系統(tǒng)的代碼(JSON模塊)
  • Python解析JSON對象的全過程記錄
  • 使用python把json文件轉換為csv文件
  • Python3中對json格式數(shù)據的分析處理
  • python實現(xiàn)xml轉json文件的示例代碼
  • 基于telepath庫實現(xiàn)Python和JavaScript之間交換數(shù)據

標簽:呼和浩特 湖州 畢節(jié) 中山 江蘇 駐馬店 股票 衡水

巨人網絡通訊聲明:本文標題《python 調用js的四種方式》,本文關鍵詞  python,調用,的,四種,方式,;如發(fā)現(xiàn)本文內容存在版權問題,煩請?zhí)峁┫嚓P信息告之我們,我們將及時溝通與處理。本站內容系統(tǒng)采集于網絡,涉及言論、版權與本站無關。
  • 相關文章
  • 下面列出與本文章《python 調用js的四種方式》相關的同類信息!
  • 本頁收集關于python 調用js的四種方式的相關信息資訊供網民參考!
  • 推薦文章