當咱們分析爬蟲時,有時候會遇到一些加密參數,這個時候就須要咱們逆向分析jshtml
python執行js有一些第三方庫node
https://www.jianshu.com/p/2da6f6ad01f0python
由於我用的Python3,因此沒用PyV8(安裝網上的方法,也沒有安裝好,可能我太笨了 - -! 若是有會的麻煩指點一下)npm
我用的比較多的就是js2py和execjs瀏覽器
有一次在分析js時,我已經找到了對應的加密方法,在瀏覽器上運行時,直接拿到告終果,開心的一匹dom
然我把js代碼複製下來,在Python裏經過js2py運行執行,發現報錯,說ui
ReferenceError: window is not defined
想到這個瀏覽器裏的對象,感受很絕望,而後想到execjs依賴node執行,是否能夠從這裏突破加密
結果依然不行,由於在node裏也是隻能運行js語法,window 和 document等對象是沒有的code
後面機緣巧合之下,找到node裏有一個庫jsdom,這個庫能夠生成對應環境htm
https://www.npmjs.com/package/jsdom
全局安裝命令
npm i jsdom -g
能夠看到導入後各類環境都有了,完美
因此咱們只要在對應js代碼裏最前面加上如下代碼就能正常運行
const jsdom = require("jsdom"); const { JSDOM } = jsdom; const dom = new JSDOM(`<!DOCTYPE html><p>Hello world</p>`); window = dom.window; document = window.document; XMLHttpRequest = window.XMLHttpRequest;
在全局安裝jsdom後,在node裏按上面的寫法是沒有問題的,可是咱們要在python中使用的話,不能在全局安裝
若是在全局安裝,使用時會報以下錯誤,說找不到jsdom
execjs._exceptions.ProgramError: Error: Cannot find module 'jsdom'
解決辦法有兩種
1.就是在python執行文件所在的運行目錄下,使用npm安裝jsdom
import execjs with open(r'要運行的.js','r',encoding='utf-8') as f: js = f.read() ct = execjs.compile(js,cwd=r'C:\Users\w001\AppData\Roaming\npm\node_modules') print(ct.call('Rohr_Opt.reload','1'))