前言
若能在 Python 調用 JavaScript 函式,將能讓爬蟲的能力更強大,因為有些函式在目標網站上已經用 JavaScript 寫好,我們只需要將其 js 檔案下載並透過 Python 執行,便能得到一樣的結果。這篇文章記錄如何使用 PyExecJS 套件來完成這件事。
環境
- Python 3.9.6
- PyExecJS 1.5.1
安裝 PyExecJS
養成習慣,在安裝套件之前,務必先將 pip 做更新
1
| python -m pip install --upgrade pip
|
安裝 PyExecJS 套件本人
PyExecJS 使用
環境建立
在同一個目錄中建立兩個檔案,分別為 main.py
與 main.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
with open('./main.js', 'r') as f: content = f.read()
jsContext = execjs.compile(content)
result = jsContext.call('whoAmI')
print(type(result)) print(result)
|
整數作為參數呼叫函式
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
with open('./main.js', 'r') as f: content = f.read()
jsContext = execjs.compile(content)
result = jsContext.call('add', 1, 2)
print(type(result)) print(result)
|
物件作為參數呼叫函式
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
with open('./main.js', 'r') as f: content = f.read()
jsContext = execjs.compile(content)
vars = { "x": 4, "y": 5 }
result = jsContext.call('objAdd', vars)
print(type(result)) print(result)
|
呼叫回傳值為物件的函式
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
with open('./main.js', 'r') as f: content = f.read()
jsContext = execjs.compile(content)
result = jsContext.call('getPersonInfo')
print(type(result)) print(result)
|