专栏首页Pythonpython使用execjs执行含有document、window等对象的js代码,使用jsdom解决

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

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

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • vue之导入Bootstrap以及jQuery的两种方式

    Vue引入bootstrap主要有两种方法 方法一:在main.js中引入 此方法导入的bootstrap中对于html,body的一些预设置的css样式可能无...

    用户1214487
  • Django视图层之路由配置系统(urls)

    视图层之路由配置系统(urls) URL配置(URLconf)就像Django 所支撑网站的目录。它的本质是URL与要为该URL调用的视图函数之间的映射表;你就...

    用户1214487
  • python装饰器大详解

    一.作用域 在python中,作用域分为两种:全局作用域和局部作用域。 全局作用域是定义在文件级别的变量,函数名。而局部作用域,则是定义函数内部。  关于作用...

    用户1214487
  • Perl遍历目录

    1、默认activePerl下的采用的编码是gbk,所以需要将字符串转为gbk才不会显示乱码

    meteoric
  • 用 Node.js 实现定时任务[每日前端夜话0xFE]

    在本文中,我们将研究如何在 Node 程序中创建和使用 Cron 作业。为此我们将创建一个简单的程序,该应用程序会自动从服务器中删除自动生成的 error.lo...

    疯狂的技术宅
  • Python--URL操作

    目标URL:http://127.0.0.1:5000/oauth/authorize?redirect_uri=http%3A%2F%2F127.0.0.1%...

    py3study
  • Github项目推荐 | DoodleNet - 用Quickdraw数据集训练的CNN涂鸦分类器

    DoodleNet 是一个涂鸦分类器(CNN),对来自Quickdraw数据集的所有345个类别进行了训练。

    AI研习社
  • Python:读取 .doc、.docx 两种 Word 文件简述及“Word 未能引发事件”错误

    Python 中可以读取 word 文件的库有 python-docx 和 pywin32。

    丹枫无迹
  • 数据抓取与利用行为的不正当竞争法规制

    编者按: 随着大数据时代的来临,数据的利用纠纷在司法实践中初露端倪。数据虽然在新修订的《民法总则》中作为一种新的客体出现,但其客体的范围、权利归属,权利界限在立...

    企鹅号小编
  • 23种设计模式之——抽象工厂模式

    1、最大的好处便是易于交换产品系列,由于具体工厂类,在一个应用中只需要在初始化的时候出现一次,这就使得改变一个应用的具体工厂变得非常容易,它只需要改变具体工厂即...

    良月柒

扫码关注云+社区

领取腾讯云代金券