这取决于多种场景。我将仅概述以下问题的每种答案组合的步骤。
- 是不是有一段JS叫做onload(ol)或者脚本块立即被评估(ie)?
- 它是内联脚本吗(is)或者是单独加载脚本(src 属性)(ls)?
- 脚本块是否还包含一些不应删除的代码(nr)或者可以完全删除(rc)?
1. 脚本单独加载(ls)并且代码可以完全删除(rc)
注册到onResourceRequested
听众和request.abort()
取决于匹配的 url。
2. 脚本单独加载(ls)并且也包含其他代码(nr)
只有当以下代码块不依赖于不应删除的代码时(这不太可能),才能执行此操作。这对于在 DOM 中注册的点击事件很可能是必需的。
在这种情况下取消请求,如1.,通过 XHR 下载脚本,删除不需要的代码部分并将代码块添加到 DOM。为此,您需要禁用网络安全,否则如果不在同一域中,则无法请求资源:--web-security=false
.
3.脚本加载DOM(is)&JS通过onload
(ol) & 可以完全移除 (rc)
这可能很容易出错。您将开始一个间隔setInterval(function(){}, 5)
from a page.onInitialized http://phantomjs.org/api/webpage/handler/on-initialized.html打回来。在间隔内,您需要检查是否window.onload
(或者你可以得到的其他东西)是在页面上下文中设置的。如果它确实是您要通过检查删除的功能,则将其删除window.onload.toString().match(/something/)
.
这可以在页面上下文(内部page.evaluate
).
4.脚本加载DOM(is)&JS通过onload
(ol) & 还包含其他代码 (nr)
开始就像3.,但不是删除window.onload
, 你可以做
eval("window.onload = " + window.onload.toString().replace(/something/,''))
5. 脚本与 DOM 一起加载 (is) 并立即评估脚本块 (ie)
您可以将页面加载为 XHR、替换文本并将调整后的内容应用到页面。这本质上是一个填充的about:blank
页。为此,您需要禁用网络安全,否则如果不在同一域中,则无法请求资源:--web-security=false
or --local-to-remote-url-access=true
。这也适用于3. and 4..
但仍然存在一个问题。大多数时候页面不使用完整的 URL。因此,当脚本或元素引用时stuff.php
PhantomJS 无法请求它。当。。。的时候page.content
设置后,页面 URL 本质上是 about:blank 并且所有 URL 不完整的请求都指向file:///...
。显然不存在这样的文件。这些资源必须替换为其完整的 URL 对应项。
此类 URL 分为三种类型:
-
//example.com/resource.php
可变协议
-
/resource.php
可变协议和域
-
resource.php
可变协议、域和资源路径
完整示例:
var page = require('webpage').create(),
url = 'http://www.example.com';
page.open(url, function(status) {
if (status !== 'success') {
console.log('Unable to access network');
} else {
var content = page.evaluate(function(url){
var xhr = new XMLHttpRequest();
xhr.open("GET", url, false);
xhr.send();
return xhr.responseText;
}, url);
page.render("test_example.png");
page.content = content.replace(/xample/g,"asy");
page.render("test_easy.png");
console.log("url "+page.url); // about:blank
phantom.exit();
}
});
除了简单的字符串替换之外,您可能还想研究正确的操作技术。