R-如何在rvest中设置超时



简单的问题:此代码x <- read_html(url)悬挂并读取页面无限秒数。例如,我不知道该如何处理这一点,例如通过为响应设置一些最长的时间。我可以使用尝试,捕捉,什么要重试。但这只是悬挂,什么也没有发生。有人知道如何处理吗?

页面没有问题,有时会发生,而当我手动重试时。

您可以将read_html包装在GET函数中httr软件包

例如。如果您的原始代码为

library(rvest)
library(dplyr)
my_url <- "https://stackoverflow.com/questions/48722076/how-to-set-timeout-in-rvest"
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(url访问(下面的第二个URL将延迟3秒钟,然后再提供HTML,这是测试所需的功能的好方法(。我们将超时设置2秒钟,以便我们知道它将失败。tryCatch()函数将简单地执行您作为第二个参数的任何代码;在这种情况下,它将仅分配"定时!"到列表元素


my_urls <- c("https://stackoverflow.com/questions/48722076/how-to-set-timeout-in-rvest",
             "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!" } )
  
}

现在,我们检查输出 - 第一个和第三个站点返回内容,第二个时间安排

# > x
# [[1]]
# {xml_document}
# <html itemscope="" itemtype="http://schema.org/QAPage" class="html__responsive">
#   [1] <head>n<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">n<title>r - how to set timeout ...
# [2] <body class="question-page unified-theme">rn    <div id="notify-container"></div>rn    <div id="custom ...
# 
# [[2]]
# [1] "Timed out!"
# 
# [[3]]
# {xml_document}
# <html>
# [1] <body><p>{n  "args": {}, n  "data": "", n  "files": {}, n  "form": {}, n  "headers": {n    "Accept": ...

显然,您可以将超时值设置为所需的任何内容。根据用途,30-60秒可能是明智的。

相关内容

  • 没有找到相关文章

最新更新