首页 > 解决方案 > 使用坚持()可靠地获取在线文件的最佳方法?

问题描述

我有一个树莓派,用来收集卫星数据。它需要的第一步是从http://www.celestrak.com/NORAD/elements/weather.txt获取有关卫星轨道的信息,但是 Pi 所在的 wifi 连接不可靠。我一直在使用来自 httr 的 GET() , satellite_data <- GET("http://www.celestrak.com/NORAD/elements/weather.txt") 但我正在寻找一个更强大的解决方案来重试,如果它失败了,每次不成功的尝试都会从几秒钟到几小时或一天后退。是我无法实时调试的远程传感器。我查看了https://purrr.tidyverse.org/reference/insistently.html但仍然不知道如何将它与 GET 一起使用。

标签: rpurrrhttr

解决方案


我做过的最好的是

possibly_get_data <- function(url, n_tries, ...){

     #Set exponential back-off so that each ith request waits pause_base * 2^i 
     rate <- rate_backoff(pause_base = 1, max_times = n_tries)
     possibly_insistent_get <- insistently(GET, rate, quiet = FALSE) %>% possibly(otherwise = NULL)

     possibly_insistent_get(url, ...)
}

所以通过网络连接我得到

> library(httr)
> library(purrr)
> library(reprex)
> possibly_get_data <- function(url, n_tries, ...){
+ 
+     rate <- rate_backoff(pause_base = 1, max_times = n_tries)
+     possibly_insistent_get <- insistently(GET, rate, quiet = FALSE) %>% possibly(otherwise = NULL)
+ 
+     possibly_insistent_get(url, ...)
+ }
> satellite_data <- possibly_get_data("http://www.celestrak.com/NORAD/elements/weather.txt", 5)
> satellite_data
Response [http://www.celestrak.com/NORAD/elements/weather.txt]
  Date: 2019-08-18 12:50
  Status: 200
  Content-Type: text/plain
  Size: 9.07 kB
DMSP 5D-2 F14 (USA 131) 
1 24753U 97012A   19228.95808892  .00000036  00000-0  41402-4 0  9995
2 24753  99.0314 236.6619 0008659 358.7096   1.4054 14.15859916154988
NOAA 15                 
1 25338U 98030A   19228.92040895  .00000033  00000-0  32688-4 0  9997
2 25338  98.7447 250.0738 0011550  73.3037 286.9410 14.25926944105431
DMSP 5D-3 F15 (USA 147) 
1 25991U 99067A   19228.94325824 -.00000108  00000-0 -31378-4 0  9993
2 25991  98.9231 193.7199 0008799 249.0096 180.8141 14.16519712 17178
METEOSAT-8 (MSG-1)      
...

没有连接我得到

> satellite_data <- possibly_get_data("http://www.celestrak.com/NORAD/elements/weather.txt", 5)
Error: Could not resolve host: www.celestrak.com
Retrying in 1 seconds.
Error: Could not resolve host: www.celestrak.com
Retrying in 3 seconds.
Error: Could not resolve host: www.celestrak.com
Retrying in 7 seconds.
Error: Could not resolve host: www.celestrak.com
Retrying in 1e+01 seconds.
Error: Could not resolve host: www.celestrak.com
> satellite_data
NULL

但它还没有处理来自服务器的错误响应


推荐阅读