Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/420.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/html/71.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript PhantomJS和Google Chrome/Firefox的HTML输出是不同的_Javascript_Html_Phantomjs_Scrape_Scraper - Fatal编程技术网

Javascript PhantomJS和Google Chrome/Firefox的HTML输出是不同的

Javascript PhantomJS和Google Chrome/Firefox的HTML输出是不同的,javascript,html,phantomjs,scrape,scraper,Javascript,Html,Phantomjs,Scrape,Scraper,我调试这个已经很长时间了,它让我完全困惑。我需要为一个工作项目把广告保存到我的电脑上。下面是我从CNN.com上得到的一个广告示例: 当我在Google Chrome和Firefox中访问此链接时,我会看到一则广告(如果链接停止工作,只需访问CNN.com并获取其中一则广告的iframe URL)。我开发了一个PhantomJS脚本,可以保存屏幕截图和任何页面的HTML。它适用于任何网站,但对这些广告似乎不起作用。屏幕截图是空白的,HTML包含一个跟踪像素(用于跟踪广告的1x1透明gif)。我

我调试这个已经很长时间了,它让我完全困惑。我需要为一个工作项目把广告保存到我的电脑上。下面是我从CNN.com上得到的一个广告示例:

当我在Google Chrome和Firefox中访问此链接时,我会看到一则广告(如果链接停止工作,只需访问CNN.com并获取其中一则广告的iframe URL)。我开发了一个PhantomJS脚本,可以保存屏幕截图和任何页面的HTML。它适用于任何网站,但对这些广告似乎不起作用。屏幕截图是空白的,HTML包含一个跟踪像素(用于跟踪广告的1x1透明gif)。我想它会给我在普通浏览器中看到的东西

我能想到的唯一一件事是,AJAX调用不知怎么搞砸了PhantomJS,所以我硬编码了一个延迟,但得到了相同的结果

下面是重现我的问题的最基本的测试代码:

var fs = require('fs');
var page = require('webpage').create();
var url = phantom.args[0];

page.open(url, function (status) {
    if (status !== 'success') {
        console.log('Unable to load the address!');
        phantom.exit();
    }
    else {
        // Output Results Immediately
        var html = page.evaluate(function () {
            return document.getElementsByTagName('html')[0].innerHTML;
        });
        fs.write("HtmlBeforeTimeout.htm", html, 'w');
        page.render('RenderBeforeTimeout.png');

        // Output Results After Delay (for AJAX)
        window.setTimeout(function () {
            var html = page.evaluate(function () {
                return document.getElementsByTagName('html')[0].innerHTML;
            });
            fs.write("HtmlAfterTimeout.htm", html, 'w');
            page.render('RenderAfterTimeout.png');
            phantom.exit();
        }, 9000); // 9 Second Delay 
    }
});
您可以在终端中使用以下命令运行此代码:

phantomjs getHtml.js 'http://www.google.com/'
上述命令运行良好。当你用一个广告URL(如本文顶部的那个)替换谷歌URL时,is给了我我解释过的意想不到的结果

非常感谢你的帮助!这是我在这里发布的第一个问题,因为我几乎总能通过搜索堆栈溢出找到答案。然而,这一次却把我彻底难倒了!:)

编辑:我正在Ubuntu 14.04(Trusty Tahr)上运行PhantomJS 1.9.7

编辑:好的,我已经做了一段时间了,我想这和饼干有关。如果我清除所有历史记录并在浏览器中查看链接,它也会显示为空白。如果我随后刷新页面,它将显示良好。如果我在新选项卡中打开它,它也会显示良好。唯一一次没有,是当我试图在清除cookies后直接查看它时


编辑:我尝试在PhantomJS中加载链接两次,但没有退出(在调用phantom.exit()之前在脚本中手动请求链接两次)。它不起作用。在PhantomJS文档中,它说CookieJAR在默认情况下是启用的。有什么想法吗?:)

您应该尝试使用onLoadFinished回调,而不是在page.open中检查状态。像这样的方法应该会奏效:

var fs = require('fs');
var page = require('webpage').create();
var url = phantom.args[0];

page.open(url);

page.onLoadFinished = function()
{
    // Output Results Immediately
    var html = page.evaluate(function () {
        return document.getElementsByTagName('html')[0].innerHTML;
    });
    fs.write("HtmlBeforeTimeout.htm", html, 'w');
    page.render('RenderBeforeTimeout.png');

    // Output Results After Delay (for AJAX)
    window.setTimeout(function () {
        var html = page.evaluate(function () {
            return document.getElementsByTagName('html')[0].innerHTML;
        });
        fs.write("HtmlAfterTimeout.htm", html, 'w');
        page.render('RenderAfterTimeout.png');
        phantom.exit();
    }, 9000); // 9 Second Delay 
};
我在这里有一个答案,它循环遍历本地文件夹中的所有文件,并保存生成页面的图像: 同样的原则也适用于远程HTML页面

以下是我从输出中得到的信息:
超时前:

超时后:

似乎很合理,尤其是因为您首先加载的是一堆JS,以便在以后渲染iframe,这里的计时对于渲染的内容很重要。我只是将OP的原始代码移动到onLoadFinished回调。9秒的延迟与OP一样。抱歉,评论是针对OP的。我同意你的意见:)@dbrin没问题!:)谢谢你的快速回复!我将您的代码复制并粘贴到一个新文件中,并对其进行了测试。输出与我的完全相同(它与谷歌链接配合良好,但与CNN的广告不配合)。你还有其他想法吗?:)这真是个难缠的家伙!无论我尝试什么,我只得到1x1的黑色图像。我想知道这是否与某些广告在嵌入式Flash播放器中播放有关?从1.5版开始,PhantomJS不再支持Flash,以允许PhantomJS完全无头运行,而无需xvfb。值得一试的是SlimerJS,它使用Gecko引擎而不是Webkit,Webkit支持Flash,并且具有与PhantomJS几乎相同的API。