我是一个独立的Raspberry Pi,它显示来自其他服务器的网页。
它会在30分钟后通过网页上的JavaScript重新加载。
在某些情况下,服务器无法在很短的时间内到达,而Chromium会显示通常的This webpage is not available
消息,并停止重新加载
(因为页面中没有JavaScript会触发重新加载)。
在这种情况下,我怎样才能在几秒钟后重新加载网页?
现在我有想法通过AJAX获取网站结果,并在当前页面中替换它,如果它们可用。
答案 0 :(得分:5)
不是每隔几分钟刷新一次网页,你可以做的就是使用javascript ping服务器(pingjs是一个很好的库,可以做到这一点)
现在,如果ping成功,请重新加载页面。如果不成功,请再等30秒再次ping它。连续执行此操作,基本上会让您等到服务器再次打开(即您可以ping通)
我认为与制作自己的java浏览器和制作浏览器插件相比,这是一种更简单的方法。
额外信息:您应该使用指数函数或超时检查来避免不必要的处理开销。即第一次发现ping失败,等待30秒,第二次等待30 *(2 ^ 1)秒,第三次等待30 *(2 ^ 2),依此类推,直到达到最大值。 / p>
注意 - 这假设您的服务器确实无法访问...而且不仅仅是html页面不可用(这里有一个很小但很明显的区别)
答案 1 :(得分:2)
我最喜欢的方法是每隔30分钟使用脚本在本地复制网页,并将铬指向本地副本。
优点是脚本可以每30秒运行一次,并检查在最后30分钟内是否发生了成功的页面拉动。如果是,那么什么都不做。如果否,则可以继续尝试拉动它。与此同时,浏览器将设置为每5秒刷新一次页面,但由于它正在拉动本地页面,因此每次刷新几乎不起作用。然后,您可以检测它已拉回的内容是否包含所需的内容。
此方法假设您的目标是避免每隔几秒刷新一次页面,从而减少远程页面的负载。
使用这些选项抓取整个页面....
# exit if age of last reload is less than 1800 seconds (30 minutes)
AGE_IN_SECS=$(( $( perl -e 'print time();' ) - $(stat -c "%Y" /success/directory/index.html) ))
[[ $AGE_IN_SECS -lt 1800 ]] && exit
# copy whole page to the current directory
cd /temporary/directory
wget -p -k http://www.example.com/
然后你需要以某种方式测试页面,以确保你有你需要的东西,例如(使用bash脚本)....
RESULT=$(grep -ci "REQUIRED_PATTERN_MATCH" expected_file_name )
[[ $result -gt 0 ]] && cp -r /temporary/directory/* /success/directory
rm -rf /temporary/directory/*
注意:强>
这只是你需要的基础,因为我不知道你需要什么的具体细节。但你也应该考虑尝试......
答案 2 :(得分:1)
我看到了三个解决方案:
在iframe中加载页面(如果没有阻止),并检查内容/响应。
在java中创建简单的浏览器(不是很难,即使你不懂这种语言,使用webview)
答案 3 :(得分:0)
通过javascript重新加载页面非常简单:
function refresh() {
var xhr = new XMLHttpRequest();
xhr.onreadystatechange = function() {
if (xhr.readyState == 4 && xhr.status === 200)
document.body.innerHTML = this.responseXML.body;
else
setTimeout('refresh', 1500);
};
xhr.open('GET', window.location.href);
xhr.responseType = "document"
xhr.send();
}
setInterval('refresh', 30*60*1000);
这应该按照您的要求运作