1、Python執行JS代碼--PyExecJS、PyV八、Js2Py
1.一、PyExecJSpython
PyExecJS的優勢是您不須要照顧JavaScript環境。特別是,它能夠在Windows環境中運行,而無需安裝額外的庫。PyExecJS的缺點之一是性能。PyExecJS經過文本傳達JavaScript運行時,而且運行緩慢。另外一個缺點是它不徹底支持運行時特定的功能。對於某些用例,PyV8多是更好的選擇。安裝以前先安裝JS環境,Node.js安裝好了,就能夠安裝接下來的庫了。git
安裝:github
pip3 install -i https://pypi.douban.com/simple PyExecJS
import execjs execjs.get().name # 查看調用的環境 'Node.js (V8)' ctx = execjs.compile(""" function add(x, y) { return x + y; } """) print(ctx.call("add", 1, 2)) #3 with open("enc.js", "r", encoding="utf-8") as f: #執行js文件 js = execjs.compile(f.read()) url = js.call("posturl") print(url) #http://www.renren.com/ajaxLogin/login?1=1&uniqueTimestamp=2019115032868
enc.js:ajax
function posturl() { var s = new Date; url = "http://www.renren.com/ajaxLogin/login?1=1" + "&uniqueTimestamp=" + s.getFullYear() + s.getMonth() + s.getDay() + s.getHours() + s.getSeconds() + s.getUTCMilliseconds(); return url }
1.二、PyV8函數
PyV8是Google V8引擎的Python包裝器,它充當Python和JavaScript之間的橋樑?對象,並支持使用python腳本託管Google的v8引擎。和 `PyExecJS` 相比,這個庫很輕量,不須要額外裝 JS 環境,由於 V8 自己就是環境,同時也由於不須要啓動外部環境,執行速度很快。Python3 安裝不要使用pip,由於官方只支持 Python2,須要在這裏下載對應系統的二進制文件, 而後解壓後將 PyV8.py 與 _PyV8.so (如so不是這個名字須要改爲這樣) 兩文件複製到 Python 的 site-packages 目錄下,如 /usr/local/lib/python3.6/site-packages
。post
下載地址:性能
https://github.com/emmetio/pyv8-binaries
import PyV8 # 注意大小寫 with PyV8.JSContext() as ctx: ctx.eval(""" function add(x, y) { return x + y; } """) print(ctx.locals.add(1, 2)) #3
1.三、Js2Py網站
將JavaScript轉換爲Python代碼。Js2Py幾乎能夠翻譯和執行任何JavaScript代碼。Js2Py用純python編寫,沒有任何依賴關係。基本上是純Python中JavaScript核心的實現。這種方式能夠擺脫調用 JS 環境的瓶頸,但遺憾的是若是用於很長的混淆 JS 代碼,轉譯過來的大機率會報錯… 因此只建議先嚐試一下,若是報錯及時更換上面的庫。url
安裝:spa
pip3 install -i https://pypi.douban.com/simple js2py
import js2py add = js2py.eval_js(""" function add(x, y) { return x + y; } """) print(add) # 能夠看到大括號裏已被轉譯 #'function add(x, y) { [python code] }' print(add(1, 2)) #3
import js2py # 使用下邊這個方法能夠輸出轉譯後的代碼 # 能夠保存到文件裏,下次不須要再次轉譯 print(js2py.translate_js('var x = 1')) #打印結果: """ from js2py.pyjs import * # setting scope var = Scope( JS_BUILTINS ) set_global_object(var) # Code follows: var.registers(['x']) var.put('x', Js(1.0)) """
實戰技巧:
接下來就是定位目標網頁須要調用的 JS 函數,每一個網站的寫法都大不相同。只要經過 Debug ,查看數據從請求,每一步都通過哪些 JS 函數,輸出什麼樣的數據,就能夠順藤摸瓜找到一些可疑的函數,而後將這些方法逐一複製出來,層層去除多餘代碼,經過上面的庫傳入參數執行,看是否和目標網頁處理後的數據一致,就能夠找到目標函數。