Индекс множественных ошибок и ошибки http возвращаются при запуске цикла в Rstudio с использованием rvest - PullRequest
0 голосов
/ 17 октября 2019

Я пытаюсь рассчитать время полета между каждой страной в надежде создать параметры для инструмента предотвращения мошенничества, который я выделяю.

URL-адрес веб-сайта, с которым я работаю, равен https://www.travelmath.com/flying-time/from/Canada/to/Germany

Третий столбец, который у меня есть, заменяет две ссылки на страны всеми возможными комбинациями.

Я пытаюсь использовать RVEST с циклом для этого, но продолжаю получать различные ошибки. Я искал в стеке, чтобы попытаться найти другие решения для моей проблемы, но столкнулся с многочисленными проблемами. И наконец, я пытаюсь создать цикл, который не работает на веб-сайте, который я запрашиваю с помощью 55225 запросов в коротком окне.

Вот самое последнее решение, которое я пробовал, но я получаю следующие ошибкив повторении

Я попытался изменить структуру фрейма данных и обработать замену источника и назначения.

Я пытался использовать Rselenium для этого, но столкнулся и с другими проблемами. .

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

tables <- list()
index <- 1
for (i in CountryPairs){
    try(
        {
            url <- paste0("https://www.travelmath.com/flying-time/from/",i)
            table <- url %>%
            read_html()%>%
            html_nodes("#flyingtime")

            tables[index] <- table

            index <- index +1
        }
    )
}
df<-do.call("rbind",tables)

Ошибка в open.connection (x, "rb"): HTTPошибка 400.

Ошибка в таблицах [index] <- таблица: длина замены равна нулю </p>

1 Ответ

0 голосов
/ 17 октября 2019

Я взял список стран для создания вашей переменной CountryPairs и использовал ваш код, чтобы придумать это. Переменная tables заполняется временем полета в виде векторов символов. Поскольку вы получили несколько ошибок HTTP 400, я думаю, что проблема заключается в том, как вы генерируете переменную CountryPairs, создавая неверный запрос.

library(dplyr)
library(rvest)

# Vector of countries
countries <- c(
  "Afghanistan",
  "Albania",
  "Algeria",
  "Andorra",
  "Angola",
  "Argentina",
  "Armenia",
  "Australia",
  "Austria",
  "Azerbaijan"
)

# Build all combinations of two countries
countries_combinations <- combn(countries, 2)

# Build the country pairs as "Country1/to/Country2" for the request to travelmath
country_pairs <- apply(countries_combinations, 2, function(x) paste(x, collapse = "/to/"))

tables <- list()
index <- 1
for (c_pair in country_pairs){
  try(
    {
      url <- paste0("https://www.travelmath.com/flying-time/from/", c_pair)

      # Get the flight time from the #flyingtime h3 tag
      table <- url %>%
        read_html %>%
        html_nodes("#flyingtime") %>%
        html_text

      tables[index] <- table

      index <- index + 1
    }
  )
}

EDIT: Чтобы удалить неиспользованныесоединения, единственное решение, которое я нашел, было этот поток переполнения стека . Вы можете вызвать функцию:

CatchupPause <- function(secs){
 Sys.sleep(secs) # pause to let connection work
 closeAllConnections()
 gc()
} 

в конце цикла for, с помощью secs = 3, чтобы обеспечить правильное закрытие соединений.

...