现在我正在做的是使用设置间隔来查找更改。如果有任何更改,我的脚本将提醒我,如果没有,它将等待一秒钟,然后再次检查。有一个更好的方法吗?我的脚本正在寻找的信息是时间敏感的,所以如果脚本提醒我太慢,我将无法对信息做任何事情。那么我要问的是有更好的方法,所以一旦发生任何变化,我就能保持警惕吗?
代码:
page.open(url)
timer = Date.now();
do{
if(Date.now()-timer>=1000){
//Look for change
}
timer =Date.now()
}while (no chnages)
答案 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是单线程的,因此会阻止执行。
对于这种情况,您当然可以使用setTimeout
或setInterval
:
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文件夹中的作用。这些方法的问题当然是变更和变更通知之间可能存在的延迟。您当然可以减少重试间隔,直到您看不到任何差异为止。
至少有两种方法可以毫不拖延地检测到变化。
注册page.onResourceReceived
event并尝试确定您感兴趣的更改是否因所提供的有限信息而发生(无法查看请求正文)。
在PhantomJS 2.x中(在1.x中可能带有前缀),您可以创建MutationObserver以在页面上下文中查找DOM中的更改(在page.evaluate()
中)然后使用window.callPhantom
and page.onCallback
pair从页面上下文(从MutationObserver事件处理程序)向外部上下文发送即时通知。