我需要使用不同的“ key ”访问同一个网页以获取它提供的特定内容。
我有一个键列表 x
我使用 GET
来自 httr
的命令包访问网页,然后检索我需要的信息y
.
library(httr)
library(stringr)
library(XML)
for (i in 1:20){
h1 = GET ( paste0("http:....categories=&query=", x[i]),timeout(10))
par = htmlParse(file = h1)
y[i]=xpathSApply(doc = par, path = "//h3/a" , fun=xmlValue)
}
问题是经常达到超时,它会破坏循环。
因此,如果达到超时,我想刷新网页或重试 GET 命令,因为我怀疑问题出在我尝试访问的网站的 Internet 连接上。
我的代码的工作方式,超时打破了循环。我需要忽略错误并转到下一次迭代或重试访问该网站。
最佳答案
看 purrr::safely()
.您可以包装 GET
像这样:
safe_GET <- purrr::safely(GET)
这消除了
tryCatch()
的丑陋让你做:resp <- safe_GET("http://example.com") # you can use all legal `GET` params
你可以测试
resp$result
为 NULL
.把它放到你的重试循环中,你就可以开始了。您可以通过执行以下操作来查看此操作:
str(safe_GET("https://httpbin.org/delay/3", timeout(1)))
这将要求 httpbin 服务在响应前等待 3 秒,但在
GET
上设置显式超时请求到 1s。我把它包裹在 str()
显示结果:List of 2
$ result: NULL
$ error :List of 2
..$ message: chr "Timeout was reached"
..$ call : language curl::curl_fetch_memory(url, handle = handle)
..- attr(*, "class")= chr [1:3] "simpleError" "error" "condition"
因此,如果需要,您甚至可以检查消息。
关于r - 如何使用 httr GET 命令刷新或重试特定网页?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37367918/