使用RVest在Rstudio中运行循环时返回多个错误索引和HTTP错误

时间:2019-10-17 08:59:58

标签: r loops web-scraping rvest

我正在尝试计算每个国家/地区之间的飞行时间,以期为我正在寻找的防欺诈工具创建参数。

我正在使用的网站网址是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。

     

表格中的错误[索引] <-表格:替换的长度为零

1 个答案:

答案 0 :(得分:0)

我列出了用于构建您的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
    }
  )
}

编辑:要删除未使用的连接,我发现的唯一解决方案是在this stack overflow thread上。您可以调用该函数:

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

for循环的末尾,使用secs = 3,以使连接正确关闭。