python使⽤execjs执⾏含有document、window等对象的js代码,使⽤j。。。当我们分析爬⾍时,有时候会遇到⼀些加密参数,这个时候就需要我们逆向分析js
python执⾏js有⼀些第三⽅库
因为我⽤的Python3,所以没⽤PyV8(安装⽹上的⽅法,也没有安装好,可能我太笨了 - -! 如果有会的⿇烦指点⼀下)
我⽤的⽐较多的就是js2py和execjs
有⼀次在分析js时,我已经到了对应的加密⽅法,在浏览器上运⾏时,直接拿到了结果,开⼼的⼀匹
然我把js代码复制下来,在Python⾥通过js2py运⾏执⾏,发现报错,说
ReferenceError: window is not defined
想到这个浏览器⾥的对象,感觉很绝望,然后想到execjs依赖node执⾏,是否可以从这⾥突破
结果依然不⾏,因为在node⾥也是只能运⾏js语法,window 和 document等对象是没有的
后⾯机缘巧合之下,到node⾥有⼀个库jsdom,这个库可以⽣成对应环境
全局安装命令
npm i jsdom -g
可以看到导⼊后各种环境都有了,完美
代码运行js特效所以我们只要在对应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
2. 使⽤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 = execjspile(js,cwd=r'C:\Users\w001\AppData\Roaming\npm\node_modules')
print(ct.call('load','1'))