python使用execjs执行含有document、window等对象的js代码,使用jsdom解决

转载自:https://www.cnblogs.com/huchong/p/11044238.html

 

当我们分析爬虫时,有时候会遇到一些加密参数,这个时候就需要我们逆向分析js

python执行js有一些第三方库

https://www.jianshu.com/p/2da6f6ad01f0

因为我用的Python3,所以没用PyV8(安装网上的方法,也没有安装好,可能我太笨了 - -! 如果有会的麻烦指点一下)

我用的比较多的就是js2py和execjs

有一次在分析js时,我已经找到了对应的加密方法,在浏览器上运行时,直接拿到了结果,开心的一匹

然我把js代码复制下来,在Python里通过js2py运行执行,发现报错,说

 

ReferenceError: window is not defined

想到这个浏览器里的对象,感觉很绝望,然后想到execjs依赖node执行,是否可以从这里突破

结果依然不行,因为在node里也是只能运行js语法,window document等对象是没有的

后面机缘巧合之下,找到node里有一个库jsdom,这个库可以生成对应环境

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
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 = execjs.compile(js,cwd=r'C:\Users\w001\AppData\Roaming\npm\node_modules') print(ct.call('Rohr_Opt.reload','1'))

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值