r语言 - 如何使用 httr GET 命令刷新或重试特定网页



我需要使用不同的"键"访问同一个网页才能获得它提供的特定内容。

我有一个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命令,因为我怀疑问题出在我尝试访问的网站的互联网连接上。

我的代码的工作方式,超时会中断循环。我需要忽略错误并转到下一次迭代或重试以访问该网站。

看看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"

因此,如果需要,您甚至可以检查消息。

http_status(h1)可以帮助您知道问题出在哪里:

a <- http_status(GET("http://google.com"))
a
$category
[1] "Success"
$reason
[1] "OK"
$message
[1] "Success: (200) OK"

b <- http_status(GET("http://google.com/blablablablaba"))
b
$category
[1] "Client error"
$reason
[1] "Not Found"
$message
[1] "Client error: (404) Not Found"

请参阅此 HTTP 状态代码列表,了解您获得的代码的含义。

此外,tryCatch可以帮助您实现您想要的:

tryCatch({GET(h1)}, error = function(e){print("error")})

在这些情况下,新的httr函数RETRY()也很方便。 RETRY()允许您尝试调用,直到成功。

httr::RETRY("GET", "http://httpbin.org/status/200")

文档 - https://httr.r-lib.org/reference/RETRY.html

最新更新