Phantomjs禁用页面中的javascript,但启用包含的javascript

Phantomjs disable javascript in page but enable included javascript

本文关键字:javascript 启用 包含 Phantomjs      更新时间:2023-09-26

我使用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, evaluate函数总是返回null。但是当我尝试启用javascript时,evaluate函数将返回一些值。是否有任何想法,以禁用在页面中的javascript,但我包含的javascript必须工作?

page.evaluate()在页面上执行JavaScript。如果你禁用JavaScript在PhantomJS,那么你有效地不能使用page.evaluate()了。访问DOM元素的各种方式也随之而去。page.includeJs()也将不工作,因为它的脚本不能在页面上执行。

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

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

根据Artjom的建议,如果不禁用PhantomJS在页面上执行JavaScript的能力,则无法禁用目标网站JavaScript的执行。然而,有一种简单的方法可以确保目标网站不执行脚本(最终达到相同的结果)。

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

您可以使用--proxy配置配置phantomjs使用代理。

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

使用cheerio来删除、注释掉或使<script>标记无效。