婷婷综合国产,91蜜桃婷婷狠狠久久综合9色 ,九九九九九精品,国产综合av

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

python 調用js的四種方式

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

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 execjs

from js_code import *

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

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

# 調用js代碼中的add()方法,參數為2和3
# 方法名:add
# 參數:2和3
result1 = 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,2
result = 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 -e
cmd = '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 PyV8
from js_code import js_from_file

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

# 調用js函數,指定參數
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()函數的使用解析
  • python執行js代碼的方法
  • Python如何把不同類型數據的json序列化
  • Python 如何保存json文件并格式化
  • Python實現學生管理系統的代碼(JSON模塊)
  • Python解析JSON對象的全過程記錄
  • 使用python把json文件轉換為csv文件
  • Python3中對json格式數據的分析處理
  • python實現xml轉json文件的示例代碼
  • 基于telepath庫實現Python和JavaScript之間交換數據

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

巨人網絡通訊聲明:本文標題《python 調用js的四種方式》,本文關鍵詞  python,調用,的,四種,方式,;如發現本文內容存在版權問題,煩請提供相關信息告之我們,我們將及時溝通與處理。本站內容系統采集于網絡,涉及言論、版權與本站無關。
  • 相關文章
  • 下面列出與本文章《python 調用js的四種方式》相關的同類信息!
  • 本頁收集關于python 調用js的四種方式的相關信息資訊供網民參考!
  • 推薦文章
    主站蜘蛛池模板: 东乡族自治县| 杭锦后旗| 巴林右旗| 沐川县| 延庆县| 印江| 谢通门县| 都兰县| 清镇市| 长寿区| 綦江县| 平武县| 友谊县| 闻喜县| 正镶白旗| 柞水县| 新郑市| 台南县| 高淳县| 宣威市| 琼中| 内江市| 名山县| 乌兰县| 平舆县| 东海县| 南汇区| 襄汾县| 汾阳市| 临沧市| 奉新县| 太谷县| 长兴县| 科技| 垦利县| 商洛市| 克拉玛依市| 乡城县| 崇文区| 台南市| 宽城|