使用R从Web下载数据会产生libcurl错误

时间:2017-11-09 17:50:14

标签: r web download

我有以下用于下载数据的R脚本,但它给了我一个错误。我该如何解决这个错误?

rm(list=ls(all=TRUE))

library('purrr')

years <- c(1980:1981)
days <- c(001:002)

walk(years, function(x) {
map(x, ~sprintf("https://hydro1.gesdisc.eosdis.nasa.gov/data/NLDAS/NLDAS_MOS0125_H.002/%s/%s/.grb", years, days)) %>% 
  flatten_chr() -> urls
download.file(urls, basename(urls), method="libcurl")
}) 

错误:

  

download.file(urls,basename(urls),method =&#34; libcurl&#34;)出错:     此平台不支持download.file(method =&#34; libcurl&#34;)   我有以下R脚本用于下载数据,但它给我一个错误。我该如何解决这个错误?

会话信息:

enter image description here

2 个答案:

答案 0 :(得分:2)

这意味着libcurl可能无法安装或可用于您的操作系统。请注意,method参数有其他选项,并且该方法因操作系统而异(与错误消息中的平台大致相同)。我会尝试使用其他方法(例如wgetcurl ...)。

download.files的帮助下......

 The supported ‘method’s do change: method ‘libcurl’ was introduced
     in R 3.2.0 and is still optional on Windows - use
     ‘capabilities("libcurl")’ in a program to see if it is available.

答案 1 :(得分:1)

我已经开始对@gballench的答案进行轻微编辑了(因为我不需要这些pts)但是它比你拥有它更复杂,因为你不会用这个成语找到你需要的文件(由于一系列原因,我99%肯定是出于我的答案:-)。

首先days需要用0 s填充到第3个长度,但是你做的方式不会这样做。其次,您可能希望从每年/ 00x组合下载所有.grb个文件,因此您需要一种方法来获取这些文件。最后,该站点需要身份验证,因此您需要注册并使用基本身份验证。

这样的事情:

library(purrr)
library(httr)
library(rvest)

years <- c(1980:1981)
days <- sprintf("%03d", 1:2)

sprintf("http://hydro1.gesdisc.eosdis.nasa.gov/data/NLDAS/NLDAS_MOS0125_H.002/%s/%%s/", years) %>% 
  map(~sprintf(.x, days)) %>% 
  flatten_chr() %>%
  map(~{
    base_url <- .x
    sprintf("%s/%s", base_url, read_html(.x) %>% 
              html_nodes(xpath=".//a[contains(@href, '.grb')]") %>% 
              html_attr("href"))
  }) %>% 
  flatten_chr() %>% 
  discard(~grepl("xml$", .)) %>% 
  walk(~{
    output_path <- file.path("FULL DIRECTORY PATH", basename(.x))
    if (!file.exists(output_path)) {
      message(.x)
      GET(
        url = .x, 
        config = httr::config(ssl_verifypeer = FALSE),
        write_disk(output_path, overwrite=TRUE),
        authenticate(user = "me@example.com", password = "xldjkdjfid8y83"),
        progress()
      )
    }
  })

您需要安装httr软件包,该软件包将安装curl软件包并最终使libcurl可用于将来更简单的批量下载。

我记得我有一个帐户,所以我把它与这个应用程序联系起来对此进行了测试(在30次下载时将其杀死)并且可以正常我在progress()电话中添加了GET(),因此您可以看到它下载单个文件。它会跳过已下载的文件(因此您可以随时将其删除并重新启动)。如果您需要重新下载任何内容,只需删除要重新下载的文件。

如果您还需要.xml个文件,请删除discard()来电。