等待一个URL下载一个网页的所有内容

Wait for a URL to download all the contents of a webpage

我要下载 HTML 个 URL 的内容。问题是 URL 需要一些时间来加载,所以在记录内容之前我必须等待/超时一段时间(~10 - 15 秒)。为此,我尝试了两种方法,但都无法产生预期的结果。

第一种方法是使用 setTimeOut:

var page = require('webpage').create()
page.open(url, function (status) {
    if (status !== 'success') {
        console.log('Unable to load the address!');
        phantom.exit();
    } else {
        window.setTimeout(function () {
            console.log(page.content);
            phantom.exit();
        }, 10000);  
    }
});

但是setTimeout 未能设置指定的超时时间。无论我将什么值设置为 Timeout ,它都会在小于页面加载时间的固定时间后超时。

第二种方法是使用 OnLoadFinished:

var page = new WebPage(), testindex = 0, loadInProgress = false;

page.onConsoleMessage = function(msg) {
    console.log(msg)
};

page.onLoadStarted = function() {
    loadInProgress = true;
    console.log("load started");
};

page.onLoadFinished = function() {
    loadInProgress = false;
    console.log("load finished");
};

var steps = [
    function() {
        page.open("url");
    },

    function() {
        console.log(page.content);
    }
];


interval = setInterval(function() {
    if (!loadInProgress && typeof steps[testindex] == "function") {
        console.log("step " + (testindex + 1));
        steps[testindex]();
        testindex++;
    }
    if (typeof steps[testindex] != "function") {
        console.log("test complete!");
        phantom.exit();
    }
}, 5000);

在这种方法中,OnLoadFinished 在加载整个页面之前触发。

我是phantomJS新手,所以上面两个解决方案也是来自stack overflow。有什么我遗漏的是我的案子特有的吗?还有其他方法可以达到相同的结果吗? (我也尝试 Waitfor 构造,但没有成功)。

好的,你的问题是在超时后加载内容。如果您正在寻找 DOM 元素,您必须使用已知的 WaitFor 函数。但是如果你只是想在超时后获取页面内容,那就简单多了。那么让我们开始吧。

var page = require("webpage").create();
var address = "http://someadress.com/somepath/somearticle";
var timeout = 10*1000;

page.open(address);


function getContent() {
    return page.evaluate(function() {
        return document.body.innerHTML;
    });
}

page.onLoadFinished = function () {
    setTimeout(function() {
       console.log(getContent());
    }, timeout);

}

注意! 如果您正在等待 HTML 正文中的大量内容,请使用 setInterval 函数,等待 document.body.innerHTML 比您想要的更多。