2017-11-09 1 views
0

Ich habe das folgende R-Skript zum Herunterladen von Daten, aber es gibt mir einen Fehler. Wie kann ich diesen Fehler beheben?Download Daten aus dem Web mit R gibt libcurl Fehler

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") 
}) 

Fehler:

Error in download.file(urls, basename(urls), method = "libcurl") : download.file(method = "libcurl") is not supported on this platform I have the following R script for downloading data but it gives me an error. How can I fix this error?

Session info:

enter image description here

Antwort

2

Das bedeutet, dass libcurl möglicherweise nicht für Ihr Betriebssystem installiert oder verfügbar werden. Beachten Sie, dass das Argument method andere Optionen aufweist und diese Methode in den verschiedenen Betriebssystemen unterschiedlich ist (mehr oder weniger dasselbe wie die Plattform in der Fehlermeldung). Ich würde mit anderen Methoden versuchen (z. B. wget, curl ...).

Von Hilfe 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

ich ein Licht bearbeiten @ gballench Antwort zu tun hatte begonnen (da ich nicht rly die Punkte müssen), aber es ist komplizierter, als Sie es haben weil du nicht zu den Dateien kommst, die du mit diesem Idiom benötigst (was ich zu 99% sicher bin, ist aus einer Antwort von mir :-) aus einer ganzen Reihe von Gründen.

Zuerst days muss auf Länge 3 gepolstert werden mit 0 s aber die Art, wie Sie es getan haben, wird das nicht tun. Zweitens möchten Sie wahrscheinlich alle .grb Dateien aus jedem Jahr/00x Combo herunterladen, so dass Sie einen Weg brauchen, um diese zu bekommen. Schließlich erfordert diese Website eine Authentifizierung, daher müssen Sie sich registrieren und die Standardauthentifizierung dafür verwenden.

Etwas wie folgt aus:

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 = "[email protected]", password = "xldjkdjfid8y83"), 
     progress() 
    ) 
    } 
    }) 

Sie finden das httr Paket installieren müssen, die das curl Paket installieren und schließlich libcurl für einfachere Batch-Downloads in Zukunft zur Verfügung stellen.

Ich erinnerte mich, dass ich ein Konto hatte, also habe ich es mit dieser App verbunden & getestet dies (tötete es bei 30 Downloads) und es funktioniert. Ich fügte progress() zum GET() Anruf hinzu, also können Sie es sehen, einzelne Dateien herunterladend. Es überspringt bereits heruntergeladene Dateien (damit Sie es jederzeit beenden und neu starten können). Wenn Sie Dateien erneut herunterladen müssen, entfernen Sie einfach die Datei, die Sie erneut herunterladen möchten. Wenn Sie auch die .xml Dateien benötigen, entfernen Sie den discard() Aufruf.

+0

Vielen Dank für die Antwort. Ich habe Ihren Code versucht, aber es gibt mir den folgenden Fehler: Fehler in open.connection (x, "rb"): SSL-Verbindungsfehler. Ich habe ein aktives Konto bei dieser Website und habe meine Anmeldeinformationen verwendet. Kann nicht verstehen, worum es sich bei diesem Fehler handelt. Außerdem gibt es in Ihrem Skript eine Möglichkeit, den Ausgabepfad anzugeben, an den die Daten heruntergeladen werden sollen. – user8848543

+0

Bitte sehen Sie das Bild oben für die Sitzungsinformationen. – user8848543

+0

Ich habe nicht das Admin-Privileg, um Zertifikate in Ubuntu zu aktualisieren. Glaubst du, dass dieser Code in Windows funktioniert? Wenn es funktioniert, gibt es auch eine Möglichkeit, den Ausgabedatenpfad anzugeben? Nur neugierig, auf welchem ​​Betriebssystem Sie das Skript ausgeführt haben. Ich nehme an, das funktioniert für dich. – user8848543