我需要使用不同的“密钥”访问同一网页才能获取它提供的特定内容。
我有一个钥匙列表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 命令,因为我怀疑问题出在我尝试访问的网站的互联网连接上。
我的代码的工作方式,超时打破了循环。我需要忽略该错误并进入下一次迭代,或者重试访问该网站。
Look at purrr::safely()
。你可以包裹GET
像这样:
safe_GET <- purrr::safely(GET)
这消除了丑陋tryCatch()
让你做:
resp <- safe_GET("http://example.com") # you can use all legal `GET` params
你可以测试resp$result
for 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"
因此,如果需要,您甚至可以查看该消息。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)