如何使用httr GET命令刷新或重试特定网页?

Fel*_*nga 6 timeout get r httr

我需要使用不同的"密钥"访问同一网页,以获取它提供的特定内容.

我有一个键列表,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)

}
Run Code Online (Sandbox Code Playgroud)

问题是经常会达到超时,并且会中断循环.

因此,如果达到超时,我想刷新网页或重试GET命令,因为我怀疑问题出在我试图访问的网站的互联网连接上.

我的代码工作方式,超时打破了循环.我需要忽略错误并转到下一次迭代或重试访问该网站.

hrb*_*str 8

看看purrr::safely().你可以这样包装GET:

safe_GET <- purrr::safely(GET)
Run Code Online (Sandbox Code Playgroud)

tryCatch()通过让你做到:这消除了丑陋:

resp <- safe_GET("http://example.com") # you can use all legal `GET` params
Run Code Online (Sandbox Code Playgroud)

你可以测试resp$resultNULL.把它放到你的重试循环中,你很高兴.

您可以通过执行以下操作来查看此操作:

str(safe_GET("https://httpbin.org/delay/3", timeout(1)))
Run Code Online (Sandbox Code Playgroud)

这将要求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"
Run Code Online (Sandbox Code Playgroud)

因此,如果需要,您甚至可以查看消息.


Fra*_* M. 5

http_status(h1) 可以帮助您了解问题所在:

a <- http_status(GET("http://google.com"))
a

$category
[1] "Success"

$reason
[1] "OK"

$message
[1] "Success: (200) OK"
Run Code Online (Sandbox Code Playgroud)

b <- http_status(GET("http://google.com/blablablablaba"))
b

$category
[1] "Client error"

$reason
[1] "Not Found"

$message
[1] "Client error: (404) Not Found"
Run Code Online (Sandbox Code Playgroud)

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

此外,tryCatch可以帮助您实现所需的目标:

tryCatch({GET(h1)}, error = function(e){print("error")})
Run Code Online (Sandbox Code Playgroud)