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'))
python使用execjs执行含有document、window等对象的js代码,使用jsdom解决的更多相关文章
- 刷新页面后,让控制台的js代码继续执行
在各种限时,秒杀活动中,有个自动循环的点击的工具是很重要的. 为了方便起见,我们把Js代码放在浏览器的控制台执行,但是刷新页面后,js代码就清空了,也就无法执行. 可以用js代码实现一个不受页面刷新影 ...
- python爬虫执行js代码-execjs
一.安装模块 pip install PyExecJS execjs会自动使用当前电脑上的运行时环境(建议用nodejs,与Phantomjs) 二.简单的使用 import execjs js_ob ...
- python运行execjs解密js
[转]http://www.knowsky.com/1041161.html python 记一次计算qzonetoken经历 之前用python写了个发表说说的爬虫,但最近发现在post数据时返回不 ...
- js常见执行方法$(document).load(),$(document).ready()
$(document).load(); 当web页面以及其附带的资源文件,如CSS,Scripts,图片等,加载完毕后执行此方法.常用于检测页面(及其附带资源)是否加载完毕. $(document). ...
- JQuery执行函数与window.onload函数
JavaScript和HTML之间的交互: 1.通过用户和浏览器操作页面时引发的事件来处理的. 2.当文档或者它的某些元素发生某些变化时,浏览器会自动生成一个事件. 例如:当浏览器装载完一个文档后,会 ...
- 深入理解,函数声明、函数表达式、匿名函数、立即执行函数、window.onload的区别.
一.函数声明.函数表达式.匿名函数1.函数声明:function fnName () {…};使用function关键字声明一个函数,再指定一个函数名,叫函数声明. 2.函数表达式 var fnNam ...
- python爬虫-execjs使用
python爬虫-execjs使用 ecexjs的作用 通过python代码去执行JavaScript代码的库 execjs的安装 pip install PyExecJS execjs使用之前,得先 ...
- 拼团商品列表页 分析 js代码行位置对执行的影响和window.onload的原理 setTimeout传参
w TypeError : Cannot set property 'innerHTML' of nullTypeError : Cannot set property 'value' of null ...
- Python3.x:打包为exe执行文件(window系统)
Python3.x:打包为exe执行文件(window系统) window系统下发布: 一.安装pyinstaller(PyInstaller 3.3.1) cmd安装命令: pip install ...
随机推荐
- ABP入门教程3 - 解决方案
点这里进入ABP入门教程目录 创建项目 点这里进入ABP启动模板 如图操作,我们先生成一个基于.NET Core的MPA(多页面应用).点击"Create my project!" ...
- Linux下使用 github+hexo 搭建个人博客03-hexo配置优化
上两张文章,我们说了 hexo 部署.主题的切换.博文的创建.MarkDown 简单使用和 hexo 部署到 GitHub Pages. 也说了我们会使用 next 主题做为我们后期博客的使用和维护. ...
- cookie,webstorage的理解
在前两天的开发时,遇到一个问题,需要将一个网页在预加载时,优先出一个弹出框,但是再次加载时不希望它出现,在经过一段时间的搜索和尝试之后,发现了大多使用的两种方式:生成cookie和webStorage ...
- Mysql—下载安装与使用
一.安装前准备 检查是否已经安装过mysql,执行命令,显示结果为:bt-mysql57-5.7.26-1.el7.x86_64 [root@localhost ~]# rpm -qa | grep ...
- Linux内核源码分析--内核启动之zImage自解压过程【转】
转自:https://www.cnblogs.com/pengdonglin137/p/3838245.html 阅读目录(Content) zImage来历 piggy.gz压缩文件的特点 vmli ...
- Successive Convex Approximation (SCA)
Successive Convex Approximation (SCA) 作者:凯鲁嘎吉 - 博客园 http://www.cnblogs.com/kailugaji/ Successive Con ...
- LeetCode 5271. 访问所有点的最小时间 Minimum Time Visiting All Points
地址 https://leetcode-cn.com/problems/minimum-time-visiting-all-points/submissions/ 题目描述平面上有 n 个点,点的位置 ...
- ClickHouse
ClickHouse 是俄罗斯的Yandex于2016年开源的列式存储数据库(DBMS),主要用于在线分析处理查询(OLAP),能够使用SQL查询实时生成分析数据报告 1 安装前的准备1.1 Cent ...
- 03-模板(过滤器,代码复用,表单,CSRF)
模块代码复用 在模板中,可能会遇到以下情况: 多个模板具有完全相同的顶部和底部内容 多个模板中具有相同的模板代码内容,但是内容中部分值不一样 多个模板中具有完全相同的 html 代码块内容 像遇到这种 ...
- Selenium+java - 使用csv文件做数据驱动
前言 早期我们使用TestNG 来做数据驱动进行测试,测试数据是写在测试用例脚本中.这会使得测试脚本的维护工作量很大.因此我们可以将测试的数据和脚本分开. 而我们经常使用会使用csv文件来做为导出数据 ...