Phantomjs 在页面中禁用 javascript 但启用包含 javascript

Phantomjs disable javascript in page but enable included javascript

我正在使用 phantomjs 从页面检索 CSS 信息而不执行其 javascript。例如这里是代码片段。

page.settings.javascriptEnabled = false;
page.open('file:///home/sample.html', function(status) {
    if (status !== 'success') {
        console.log('Unable to access network');
    } else {
        page.includeJs("file:///home/sample.js", function() {
            var class = page.evaluate(function() {
                return document.querySelector('body').className;
            });
            console.log(class);
        });
    }
}

如果我禁用 javascript,求值函数总是 return 为空。但是当我尝试启用 javascript 时,评估函数将 return 一些值。有没有办法禁用页面中的 javascript,但我包含的 javascript 必须工作?

page.evaluate() 在页面上执行 JavaScript。如果您在 PhantomJS 中禁用 JavaScript,那么实际上您不能再使用 page.evaluate()。随之而来的是各种访问 DOM 元素的方式。 page.includeJs() 也不行,因为脚本无法在页面上执行。

您仍然可以访问 page.content,它提供对当前页面源(计算源)的访问。您可以尝试使用一些 DOM 库将源解析为 DOM 对象 1 或者如果任务很简单,您可以尝试使用正则表达式。

1 注意 PhantomJS 和 node.js 有不同的执行环境,所以大多数 node.js 处理 DOM 的模块不会工作

一样,如果不禁用PhantomJS在页面上执行JavaScript的能力,则无法禁用目标网站JavaScript的执行。但是,有一种简单的方法可以确保目标网站不执行任何脚本(最后达到相同的结果)。

  1. 创建拦截所有请求的 HTTP 代理。
  2. 检测 Content-Type: text/html 的响应。
  3. 从文档中删除所有 <script> 个标签。

您可以配置 to use proxy using --proxy configuration

使用http-proxy创建代理服务器。

使用 cheerio 删除、注释掉或以其他方式使 <script> 标签无效。