Holen Sie sich API-Daten mit R.

Es gibt viele großartige R-Pakete, mit denen Sie Daten von einer API mit einer einzigen Funktion importieren können. Manchmal hat eine API jedoch keine bereits geschriebene Funktion. Die gute Nachricht ist, dass es einfach ist, Ihre eigenen zu codieren.

Ich werde dies mit der AccuWeather-API demonstrieren, aber der Prozess und der Code funktionieren für die meisten anderen APIs, die einen Schlüssel zur Authentifizierung verwenden.

Melden Sie sich für den API-Zugriff an

Wenn Sie mitmachen möchten, gehen Sie zu developer.accuweather.com und eröffnen Sie ein kostenloses Konto. Wählen Sie unter Pakete und Preise die eingeschränkte Testversion aus, die 50 API-Aufrufe pro Tag zulässt - genug, wenn Sie Ihre lokale Prognose nur ein paar Mal am Tag überprüfen möchten, aber offensichtlich nicht für öffentlich zugängliche Anwendungen.

Wenn Ihnen nicht sofort eine Option zum Erstellen einer App angezeigt wird, gehen Sie zu Meine Apps und erstellen Sie eine neue App.

Sharon Machlis,

Ich habe Andere für den Verwendungszweck der API, Interne App für das, was ich erstelle, und Andere für die Programmiersprache ausgewählt (leider ist R keine Option). Ihrer App sollte ein API-Schlüssel zugewiesen werden.

Wenn Sie diesen API-Schlüssel nicht fest in Ihr AccuWeather-Prognoseskript codieren möchten, speichern Sie ihn als R-Umgebungsvariable. Der einfachste Weg, dies zu tun, ist mit diesem Paket. usethis::edit_r_environ() öffnet Ihre R-Umgebungsdatei zur Bearbeitung. Fügen Sie eine Zeile wie  ACCUWEATHER_KEY = 'my_key_string'zu dieser Datei hinzu, speichern Sie die Datei und starten Sie Ihre R-Sitzung neu. Sie können jetzt auf den Schlüsselwert zugreifen,  Sys.getenv("ACCUWEATHER_KEY")indem Sie den Wert selbst nicht fest codieren.

Bestimmen Sie die URL-Struktur der API

Für dieses Projekt lade ich zuerst die Pakete httr, jsonlite und dplyr: httr zum Abrufen von Daten von der API, jsonlite zum Parsen und dplyr zum eventuellen Verwenden von Pipes (Sie können auch das magrittr-Paket verwenden).

Als Nächstes - und das ist wichtig - müssen Sie wissen, wie eine URL strukturiert wird, um die gewünschten Daten von der API anzufordern . Das Herausfinden der Abfragestruktur kann der schwierigste Teil des Prozesses sein, je nachdem, wie gut die API dokumentiert ist. Glücklicherweise sind die AccuWeather-API-Dokumente ziemlich gut.

Jede API-Abfrage benötigt eine Ressourcen-URL oder das, was ich als Stamm der URL betrachte, und dann bestimmte Teile der Abfrage. Folgendes sagt AccuWeather in seiner Dokumentation zur eintägigen Prognose-API: 

 //dataservice.accuweather.com / Forecasts / v1 / daily / 1day / {locationKey} 

Die Basis-URL für eine Prognose ist größtenteils konstant, diese benötigt jedoch einen Standortcode . Wenn Sie nur nach einer Prognose für einen Standort suchen, können Sie auf der AccuWeather-Website nach einer Prognose auf accuweather.com suchen und dann die URL überprüfen, die zurückkommt. Wenn ich nach der Postleitzahl 01701 (unserem Büro in Framingham, MA) suche, wird die folgende URL zusammen mit der Prognose zurückgegeben: 

//www.accuweather.com/de/us/framingham/01701/weather-forecast/571_pc

Sehen Sie das /571_pcam Ende? Das ist der Standortschlüssel. Sie können auch eine AccuWeather-Standort-API verwenden, um Standortcodes programmgesteuert abzurufen, die ich gleich zeigen werde, oder eines der webbasierten Standort-API-Tools von AccuWeather wie die Stadtsuche oder die Postleitzahlensuche. 

Erstellen Sie eine Anforderungs-URL

Abfrageparameter für bestimmte Datenanforderungen werden an das Ende einer Basis-URL angeheftet. Der erste Parameter beginnt mit einem Fragezeichen, gefolgt von Name gleich Wert. Alle zusätzlichen Schlüssel-Wert-Paare werden mit einem kaufmännischen Und gefolgt von Name gleich Wert hinzugefügt. Um meinen API-Schlüssel hinzuzufügen, sieht die URL folgendermaßen aus:

//dataservice.accuweather.com/forecasts/v1/daily/1day/571_pc?apikey=MY_KEY

Wenn ich einen zweiten Abfrageparameter hinzufügen wollte - beispielsweise die Standarddetails von false in true ändern - würde dies folgendermaßen aussehen:

//dataservice.accuweather.com/forecasts/v1/daily/1day/571_pc?apikey=MY_KEY&details=true

Holen Sie sich die Daten

Wir können die httr::GET()Funktion verwenden, um eine HTTP- GETAnfrage dieser URL zu stellen, wie z

my_url <- paste0 ("// dataservice.accuweather.com/forecasts/",

"v1 / daily / 1day / 571_pc? apikey =",

Sys.getenv ("ACCUWEATHER_KEY"))

my_raw_result <- httr :: GET (my_url)

Dieser paste0()Befehl zum Erstellen der URL hat den URL-Stamm zur besseren Lesbarkeit in zwei Zeilen aufgeteilt und dann den in der Umgebungsvariablen ACCUWEATHER_KEY R gespeicherten API-Schlüssel hinzugefügt. 

my_raw_resultist eine etwas komplexe Liste. Die eigentlichen Daten, die wir wollen, sind größtenteils inhaltlich, aber wenn Sie sich die Struktur ansehen, werden Sie feststellen, dass es sich um ein „Rohformat“ handelt, das wie Binärdaten aussieht.

Sharon Machlis,

Glücklicherweise macht es das httr-Paket einfach, mit der content()Funktion von Raw in ein verwendbares Format zu konvertieren . 

Analysieren Sie die Ergebnisse

content()gibt Ihnen drei Konvertierungsoptionen: als roh (was in diesem Fall definitiv nicht hilfreich ist); analysiert, was normalerweise eine Art Liste zurückzugeben scheint; und Text. Für JSON - insbesondere für verschachteltes JSON - ist Text am einfachsten zu bearbeiten. Hier ist der Code:

my_content <- httr :: content (my_raw_result, as = 'text')

Hier kommt das jsonlite-Paket ins Spiel. Die fromJSON()Funktion verwandelt eine JSON-Textzeichenfolge content()in ein besser verwendbares R-Objekt.

Hier sind Teilergebnisse der Ausführung der glimpse()Funktion von dplyr my_content, um einen Blick auf die Struktur zu werfen:

Sharon Machlis,

Es ist eine Liste mit zwei Elementen. Das erste Element enthält einige Metadaten und ein Textfeld, das wir möglicherweise möchten. Das zweite Element ist ein Datenrahmen mit vielen Datenpunkten, die wir definitiv für die Prognose benötigen. 

Wenn glimpse()nur dieser Datenrahmen ausgeführt wird, wird angezeigt, dass JSON verschachtelt ist, da einige der Spalten tatsächlich eigene Datenrahmen sind. Aber fromJSON()alles ziemlich nahtlos gemacht.

Observations: 1 Variables: 8 $ Date  "2019-08-29T07:00:00-04:00" $ EpochDate  1567076400 $ Temperature   $ Day   $ Night   $ Sources  ["AccuWeather"]

So these are the basic steps to pulling data from an API:

  1. Figure out the API’s base URL and query parameters, and construct a request URL.
  2. Run httr::GET() on the URL. 
  3. Parse the results with content(). You can try it with as = 'parsed', but if that returns a complicated list, try as = 'text'.
  4. If necessary, run jsonlite::fromJSON() on that parsed object.

A couple of more points before we wrap up. First, if you look again at my_raw_result — the initial object returned from GET — you should see a status code. A 200 means all was OK. But a code in the 400s means something went wrong. If you’re writing a function or script, you can check whether the status code is in the 200s before additional code runs.

Second, if you’ve got multiple query parameters, it can get a little annoying to string them all together with a paste0() command. GET() has another option, which is creating a named list of query arguments, such as: 

my_raw_result2 <- GET(url,

query = list(

apikey = Sys.getenv("ACCUWEATHER_KEY"),

details = 'true'

)

)

Sehen Sie die Struktur? Die GET()Funktion verwendet die Basis-URL als erstes Argument und eine Liste von Namen und Werten als zweites Abfrageargument. Jeder ist , mit dem Namen nicht in Anführungszeichen. Der Rest des Codes ist der gleiche.name = value

Dies funktioniert auch für die AccuWeather Locations-API.

Folgendes sucht die API:

Sharon Machlis,

Ich kann ähnlichen Code wie mit der Prognose-API verwenden, diesmal jedoch mit den Abfrageparametern apikeyund qdem AccuWeather-Schlüssel bzw. dem Text des Ortes, nach dem ich suche:

base_url <- "//dataservice.accuweather.com/locations/v1/cities/search"

ny_location_raw <- GET (base_url,

query = list (apikey = Sys.getenv ("ACCUWEATHER_KEY"),

q = "New York, NY"

))

ny_parsed%

fromJSON ()

Der Standortcode befindet sich in der Spalte Schlüssel.

> Blick (ny_parsed) Beobachtungen: 1 Variablen: 15 $ Version 1 $ Schlüssel "349727" $ Typ "Stadt" $ Rang 15 $ Lokalisierter Name "New York" $ Englischer Name "New York" $ PrimaryPostalCode "10007" $ Region $ Land $ AdministrativeArea $ TimeZone $ GeoPosition $ IsAlias ​​FALSE $ SupplementalAdminAreas []

Jetzt benötigen Sie nur noch Code, um die Daten zu verwenden, die Sie aus der API abgerufen haben.

Weitere R-Tipps finden Sie auf der Seite „Mehr mit R tun“ mit einer durchsuchbaren Tabelle mit Artikeln und Videos.