r语言 - 迭代 rvest 抓取函数给出: "Error in open.connection(x, " rb ") : Timeout was reached"



我正在使用" revest "包抓取这个网站。当我迭代我的函数太多次,我得到"错误在打开。connection(x, "rb"): Timeout was reached"。我也搜索过类似的问题,但答案似乎都是死胡同。我有一个怀疑,这是服务器端和网站有多少次内置的限制,我可以访问的页面。如何调查这个假设?

代码:我有到底层网页的链接,并希望构建一个数据框架,其中包含从相关网页提取的信息。我已经简化了我的抓取功能,因为问题仍然发生在一个更简单的函数:

scrape_test = function(link) {
  slit <-  str_split(link, "/") %>%
    unlist()
  id <- slit[5]
  sem <- slit[6]
  name <- link %>% 
    read_html(encoding = "UTF-8") %>%
    html_nodes("h2") %>%
    html_text() %>%
    str_replace_all("rn", "") %>%
    str_trim()
  return(data.frame(id, sem, name))
}

我使用purrr-package map_df()来迭代函数:

test.data = links %>%
  map_df(scrape_test)

现在,如果我只使用50个链接迭代函数,我不会收到任何错误。但是当我增加链接的数量时,我遇到了前面提到的错误。此外,我得到以下警告:

  • "In bind_rows_(x, .id):不相等的因子水平:强制字符"
  • "关闭未使用的连接4 (link)"

EDIT:下面的代码创建一个链接对象可以用来复制我的结果:

links <- c(rep("http://karakterstatistik.stads.ku.dk/Histogram/NMAK13032E/Winter-2013/B2", 100))

对于大型抓取任务,我通常会执行for循环,这有助于故障排除。为输出创建一个空列表:

d <- vector("list", length(links))

在这里,我使用tryCatch块执行for循环,因此,如果输出是错误的,我们等待几秒钟并再次尝试。我们还包括一个counter,如果我们在五次尝试后仍然得到错误,则移动到下一个链接。此外,我们有if (!(links[i] %in% names(d))),所以如果我们必须打破循环,我们可以跳过我们已经刮掉的链接,当我们重新开始循环。

for (i in seq_along(links)) {
  if (!(links[i] %in% names(d))) {
    cat(paste("Doing", links[i], "..."))
    ok <- FALSE
    counter <- 0
    while (ok == FALSE & counter <= 5) {
      counter <- counter + 1
      out <- tryCatch({                  
                  scrape_test(links[i])
                },
                error = function(e) {
                  Sys.sleep(2)
                  e
                }
              )
      if ("error" %in% class(out)) {
        cat(".")
      } else {
        ok <- TRUE
        cat(" Done.")
      }
    }
    cat("n")
    d[[i]] <- out
    names(d)[i] <- links[i]
  }
} 

相关内容

  • 没有找到相关文章

最新更新