Итерация функции очистки Rvest дает: «Ошибка в open.connection (x,« rb »): истекло время ожидания»

r function web-scraping rvest

4254 просмотра

1 ответ

Я очищаю этот сайт, используя пакет "rvest". Когда я повторяю свою функцию слишком много раз, я получаю сообщение «Ошибка в open.connection (x,« rb »): истекло время ожидания». Я искал похожие вопросы, но ответы, кажется, ведут в тупик. У меня есть подозрение, что это серверная часть, и у веб-сайта есть встроенное ограничение на то, сколько раз я могу посещать страницу. Как исследовать эту гипотезу?

Код: у меня есть ссылки на базовые веб-страницы и я хочу создать фрейм данных с информацией, извлеченной из связанных веб-страниц. Я немного упростил мою функцию очистки, поскольку проблема все еще возникает с более простой функцией:

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("\r\n", "") %>%
    str_trim()

  return(data.frame(id, sem, name))
}

Я использую purrr-пакет map_df () для итерации функции:

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

Теперь, если я повторю функцию, используя только 50 ссылок, я не получаю ошибки. Но когда я увеличиваю количество ссылок, я сталкиваюсь с вышеупомянутой ошибкой. Кроме того, я получаю следующие предупреждения:

  • «В bind_rows_ (x, .id): неравные уровни факторов: принуждение к персонажу»
  • «закрытие неиспользуемого соединения 4 ( ссылка

РЕДАКТИРОВАТЬ: Следующий код, создающий объект ссылок, может быть использован для воспроизведения моих результатов:

links <- c(rep("http://karakterstatistik.stads.ku.dk/Histogram/NMAK13032E/Winter-2013/B2", 100))
Автор: ScrapeGoat Источник Размещён: 08.11.2019 11:32

Ответы (1)


9 плюса

Решение

С большими задачами очистки я обычно делал бы цикл for, который помогает с устранением проблем. Создайте пустой список для вашего вывода:

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

Здесь я делаю цикл for с tryCatchблоком, так что если на выходе будет ошибка, мы подождем пару секунд и попробуем снова. Мы также включаем символ, 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]
  }
} 
Автор: Weihuang Wong Размещён: 20.08.2016 05:57
Вопросы из категории :
32x32