0%

[PyExecJS] Python 呼叫並執行 JavaScript 函式

前言

若能在 Python 調用 JavaScript 函式,將能讓爬蟲的能力更強大,因為有些函式在目標網站上已經用 JavaScript 寫好,我們只需要將其 js 檔案下載並透過 Python 執行,便能得到一樣的結果。這篇文章記錄如何使用 PyExecJS 套件來完成這件事。

環境

  • Python 3.9.6
  • PyExecJS 1.5.1

安裝 PyExecJS

養成習慣,在安裝套件之前,務必先將 pip 做更新

1
python -m pip install --upgrade pip

安裝 PyExecJS 套件本人

1
pip install PyExecJS

PyExecJS 使用

環境建立

在同一個目錄中建立兩個檔案,分別為 main.pymain.js,我們將會在 main.py 寫程式使用 PyExecJS 套件去呼叫在 main.js 中的 JavaScript 函式。

無參數且直接呼叫函式

main.js

1
2
3
function whoAmI() {
return 'main.js';
}

main.py

1
2
3
4
5
6
7
8
9
10
11
12
13
import execjs

# 讀取 js 檔案
with open('./main.js', 'r') as f:
content = f.read()
# 編譯 js 原始碼
jsContext = execjs.compile(content)
# 呼叫 js 函式,第一個參數為 js 函式名稱,
# 若有參數要輸入,則依序跟在後面
result = jsContext.call('whoAmI')

print(type(result)) # <class 'str'>
print(result) # main.js

整數作為參數呼叫函式

main.js

1
2
3
function add(x, y) {
return x + y;
}

main.py

1
2
3
4
5
6
7
8
9
10
11
12
13
import execjs

# 讀取 js 檔案
with open('./main.js', 'r') as f:
content = f.read()
# 編譯 js 原始碼
jsContext = execjs.compile(content)
# 呼叫 js 函式,第一個參數為 js 函式名稱,
# 若有參數要輸入,則依序跟在後面
result = jsContext.call('add', 1, 2)

print(type(result)) # <class 'int'>
print(result) # 3

物件作為參數呼叫函式

main.js

1
2
3
function objAdd(variables) {
return variables.x + variables.y;
}

main.py

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
import execjs

# 讀取 js 檔案
with open('./main.js', 'r') as f:
content = f.read()
# 編譯 js 原始碼
jsContext = execjs.compile(content)
# 建立一個 dict 物件
vars = {
"x": 4,
"y": 5
}
# 呼叫 js 函式,第一個參數為 js 函式名稱,
# 若有參數要輸入,則依序跟在後面
result = jsContext.call('objAdd', vars)

print(type(result)) # <class 'int'>
print(result) # 9

呼叫回傳值為物件的函式

main.js

1
2
3
4
5
6
function getPersonInfo() {
return {
name: 'Alice',
age: 17
}
}

main.py

1
2
3
4
5
6
7
8
9
10
11
12
13
import execjs

# 讀取 js 檔案
with open('./main.js', 'r') as f:
content = f.read()
# 編譯 js 原始碼
jsContext = execjs.compile(content)
# 呼叫 js 函式,第一個參數為 js 函式名稱,
# 若有參數要輸入,則依序跟在後面
result = jsContext.call('getPersonInfo')

print(type(result)) # <class 'dict'>
print(result) # {'name': 'Alice', 'age': 17}
很高興能在這裡幫助到您,歡迎登入 Liker 為我鼓掌 5 次,或者成為我的讚賞公民,鼓勵我繼續創造優質文章。
以最優質的內容回應您的鼓勵