python使用execjs執行含有document、window等對象的js代碼,使用jsdom解決

當咱們分析爬蟲時,有時候會遇到一些加密參數,這個時候就須要咱們逆向分析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

  1. 使用cwd參數,指定模塊的所在目錄,好比,咱們在全局安裝的jsdom,在cmd裏經過npm root -g 能夠查看全局模塊安裝路徑: C:\Users\w001\AppData\Roaming\npm\node_modules
    咱們使用時,代碼能夠按下面的寫法寫
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'))
相關文章
相關標籤/搜索