当咱们分析爬虫时,有时候会遇到一些加密参数,这个时候就须要咱们逆向分析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'))