你可以在
httr
包的
GET
函数中包装
read_html
。
例如,如果你的原始代码是:
library(rvest)
library(dplyr)
my_url <- "https://dev59.com/1FYM5IYBdhLWcg3whAeH
x <- my_url %>% read_html(.)
那么你可以用以下内容替换它
library(httr)
# Allow 10 seconds
my_url %>% GET(., timeout(10)) %>% read_html
# Allow 30 seconds
my_url %>% GET(., timeout(30)) %>% read_html
例子
为了测试,尝试设置一个极短的超时时间(例如,一百分之一秒)。
# Allow an unreasonably short amount of time so the request errors rather than hangs indefinitely
my_url %>% GET(., timeout(0.01)) %>% read_html
# Error in curl::curl_fetch_memory(url, handle = handle) :
# Timeout was reached: Resolving timed out after 10 milliseconds
你可以在这里找到更多示例。
在循环中使用它(例如,“超时后跳过到下一个”)
尝试运行此代码。它假设您有要访问的网址数量(在本例中为3个),其中第二个网址将在提供html之前延迟3秒 - 这是测试您正在寻找的功能的绝佳方法。 我们将超时设置为2秒,因此我们知道它将失败。tryCatch()
函数将仅执行其作为第二个参数放入的任何代码; 在本例中,它将仅将“已超时!”分配给列表元素。
my_urls <- c("https://dev59.com/1FYM5IYBdhLWcg3whAeH,
"http://httpbin.org/delay/3", # This url will delay 3 seconds
"http://httpbin.org/delay/1")
x <- list()
# Set timeout for 2 seconds (so second url will fail)
for (i in 1:length(my_urls)) {
print(paste0("Scraping url number ", i))
tryCatch(x[[i]] <- my_urls[i] %>% GET(., timeout(2)) %>% read_html,
error = function(e) { x[[i]] <<- "Timed out!" } )
}
现在我们检查输出 - 第一个和第三个站点返回了内容,第二个超时了
显然,您可以将超时值设置为任何您想要的值。根据使用情况,30-60秒可能是合理的。