如何使用 httr GET 命令刷新或重试特定网页?
How to refresh or retry a specific web page using httr GET command?
我需要以不同的方式访问同一个网页 "keys" 以获取它提供的特定内容。
我有一个键列表 x
,我使用 httr
包中的 GET
命令访问网页,然后检索我需要的信息 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 命令,因为我怀疑问题出在我尝试访问的网站的互联网连接上。
按照我的代码工作方式,超时会中断循环。我需要忽略错误并转到下一次迭代或重试访问该网站。
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"
查看此 list of HTTP status codes 了解您获得的代码的含义。
此外,tryCatch
可以帮助你实现你想要的:
tryCatch({GET(h1)}, error = function(e){print("error")})
看看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
请求的显式超时设置为 1 秒。我把它包裹在 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"
因此,如果需要,您甚至可以查看消息。
新的 httr
函数 RETRY()
在这些情况下也很方便。 RETRY()
允许您尝试呼叫直到成功。
httr::RETRY("GET", "http://httpbin.org/status/200")
我需要以不同的方式访问同一个网页 "keys" 以获取它提供的特定内容。
我有一个键列表 x
,我使用 httr
包中的 GET
命令访问网页,然后检索我需要的信息 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 命令,因为我怀疑问题出在我尝试访问的网站的互联网连接上。
按照我的代码工作方式,超时会中断循环。我需要忽略错误并转到下一次迭代或重试访问该网站。
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"
查看此 list of HTTP status codes 了解您获得的代码的含义。
此外,tryCatch
可以帮助你实现你想要的:
tryCatch({GET(h1)}, error = function(e){print("error")})
看看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
请求的显式超时设置为 1 秒。我把它包裹在 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"
因此,如果需要,您甚至可以查看消息。
新的 httr
函数 RETRY()
在这些情况下也很方便。 RETRY()
允许您尝试呼叫直到成功。
httr::RETRY("GET", "http://httpbin.org/status/200")