我有时会收到错误。这是基本程序:
require 'open-uri'
require 'json'
require 'date'
require 'time'
def update_wu
open("http://api.wunderground.com/api/.......12.json") {|wu|
json_string = wu.read
upd_str = ....
...
wu.close
return upd_str
}
return "NULL"
end
loop do
upd_str = update_wu
# every 5 minutes
t = Time.now
secs = (t.hour * 60 + t.min) * 60 + t.sec
wait = ((secs/(5*60)).to_i + 1) * 5 * 60 - secs
print "#{Time.now.inspect} #{upd_str} #{wait}\n"
sleep(wait)
end
这是错误:
wu.rb:12:in `block in update_wu': undefined method `[]' for nil:NilClass (NoMethodError)
from C:/Ruby23-x64/lib/ruby/2.3.0/open-uri.rb:155:in `open_uri'
from C:/Ruby23-x64/lib/ruby/2.3.0/open-uri.rb:717:in `open'
from C:/Ruby23-x64/lib/ruby/2.3.0/open-uri.rb:35:in `open'
from wu.rb:8:in `update_wu'
程序每五分钟循环一次,然后进行URI调用。它会在出现错误之前循环几十次。
什么了?
答案 0 :(得分:1)
这是我每五分钟查看一次网站并解析JSON响应的基本代码:
require 'json'
require 'open-uri'
require 'time'
INTERVAL = 5 * 60
loop do
data = JSON[open("http://httpbin.org/headers").read]
puts data
delay = INTERVAL - (Time.now.to_i % INTERVAL)
puts "Waiting #{delay} seconds"
sleep(delay)
end
不要这样做。当你不需要检索结果因为它没有改变时访问网站是非常不礼貌的互联网,并可以让你被禁止。
相反,您应该检查是否需要在请求整个资源之前检索数据。通常我们通过发送HEAD请求并将必要的数据传递给站点来执行此操作,然后将告诉我们数据是否已更改,如果已更改,则我们发出GET或POST。有关详细信息,请参阅RFC。
HEAD方法与GET相同,只是服务器不能在响应中返回消息体。响应HEAD请求的HTTP头中包含的元信息应该与响应GET请求时发送的信息相同。该方法可用于获得关于请求所暗示的实体的元信息,而无需转移实体主体本身。此方法通常用于测试超文本链接的有效性,可访问性和最近的修改。
如何做到这一点是为了你的想法。那里有很多例子。
如果无法建立连接,您将收到异常。你想拯救它。