抓住时间敏感信息的更好方法?

时间:2016-04-27 18:44:58

标签: javascript asynchronous web-scraping phantomjs

现在我正在做的是使用设置间隔来查找更改。如果有任何更改,我的脚本将提醒我,如果没有,它将等待一秒钟,然后再次检查。有一个更好的方法吗?我的脚本正在寻找的信息是时间敏感的,所以如果脚本提醒我太慢,我将无法对信息做任何事情。那么我要问的是有更好的方法,所以一旦发生任何变化,我就能保持警惕吗?

代码:

page.open(url)
timer = Date.now();
do{
if(Date.now()-timer>=1000){
//Look for change
}
timer =Date.now()
}while (no chnages)

2 个答案:

答案 0 :(得分:1)

如果您正在获取的资源正在正确设置上次修改的标头,则可以更高效地首先发出HTTP HEAD请求,并且只有在PhantomJS中已经修改过的页面才打开它。这肯定会更复杂,所以首先要检查其他选项是值得的。

检查http://stackoverflow.com上次修改时间的一些示例代码如下:

var url = 'http://stackoverflow.com';
var page = require('webpage').create();
var interval = 1000; // change according to needs
var previousLastModified;
(function modifiedCheck() {
    var xhr = new XMLHttpRequest();
    xhr.onreadystatechange = function () {
        if (xhr.readyState == 4 && xhr.status == 200) {
            var lastModified = xhr.getResponseHeader("Last-Modified");
            if (lastModified !== previousLastModified) {
                page.open(url, function(status) {
                    if (status === 'success') {
                        previousLastModified = lastModified;
                        // TODO: do something with fetched page
                        console.log('fetched page.');
                    }
                    setTimeout(modifiedCheck, interval);
                });
            } else {
                setTimeout(modifiedCheck, interval);
            }
        }
    };
    console.log('making HEAD request.');
    xhr.open('HEAD', url);
    xhr.send();
})();

您可以从控制台日志记录中看到页面缓存了1分钟。

示例中的自执行modifiedCheck函数使用匿名函数异步处理AJAX调用的结果和PhantomJS页面加载,从而限制阻塞。

请注意,您需要使用--web-security=false选项运行PhantomJS,以允许AJAX调用无错误地执行。

答案 1 :(得分:0)

在您使用同步循环时,PhantomJS无法正常工作。由于JavaScript是单线程的,因此会阻止执行。

延迟

对于这种情况,您当然可以使用setTimeoutsetInterval

var interval = 1000; // change according to needs
page.open(url, function(){
    setTimeout(function retry(){
        var condition = page.evaluate(...);
        if (!condition) {
            setTimeout(retry, interval);
        } else {
            // TODO: what to do on success
        }
    }, interval);
});

setInterval示例看起来类似。实际上,这就是waitFor()在PhantomJS的examples文件夹中的作用。这些方法的问题当然是变更和变更通知之间可能存在的延迟。您当然可以减少重试间隔,直到您看不到任何差异为止。

无延迟

至少有两种方法可以毫不拖延地检测到变化。