Dohvatite API podatke s R

Puno je sjajnih R paketa koji vam omogućuju uvoz podataka iz API-ja s jednom funkcijom. Međutim, ponekad API nema već napisanu funkciju. Dobra vijest je da je lako kodirati vlastiti kôd.

To ću demonstrirati s AccuWeather API-jem, ali postupak i kod funkcionirat će za većinu drugih API-ja koji koriste ključ za provjeru autentičnosti.

Prijavite se za pristup API-ju

Ako želite nastaviti dalje, idite na developer.accuweather.com i prijavite se za besplatni račun. U odjeljku Paketi i cijene odaberite Ograničeno suđenje, koje omogućuje 50 API poziva dnevno - dovoljno ako samo želite provjeriti lokalnu prognozu nekoliko puta dnevno, ali očito ne za bilo kakvu aplikaciju usmjerenu prema javnosti.

Ako vam se odmah ne prikaže opcija za stvaranje aplikacije, idite na Moje aplikacije i izradite novu aplikaciju.

Sharon Machlis,

Odabrao sam Ostalo za mjesto gdje će se API koristiti, Internu aplikaciju za ono što stvaram i Ostalo za programski jezik (nažalost, R nije opcija). Vašoj aplikaciji treba dodijeliti API ključ.

Ako ne želite čvrsto kodirati taj API ključ u svoju skriptu predviđanja AccuWeather, spremite ga kao varijablu okoline R. To ćete najlakše učiniti pomoću ovog paketa. usethis::edit_r_environ() otvara vašu datoteku okruženja R za uređivanje. Dodajte redak poput  ACCUWEATHER_KEY = 'my_key_string'te datoteke, spremite datoteku i ponovno pokrenite R sesiju. Sada možete pristupiti vrijednosti ključa  Sys.getenv("ACCUWEATHER_KEY")umjesto da teško kodirate samu vrijednost.

Odredite strukturu URL-a API-ja

Za ovaj projekt prvo ću učitati httr, jsonlite i dplyr pakete: httr za dobivanje podataka iz API-ja, jsonlite za njegovo raščlanjivanje i dplyr da bih na kraju koristio cijevi (možete koristiti i paket magrittr).

Dalje - i to je kritično - morate znati kako strukturirati URL kako biste od API-ja zatražili podatke koje želite . Otkrivanje strukture upita može biti najteži dio procesa, ovisno o tome koliko je API dokumentiran. Srećom, AccuWeather API dokumenti prilično su dobri.

Bilo kojem API upitu potreban je URL resursa ili ono što ja smatram korijenom URL-a, a zatim određeni dijelovi upita. Evo što AccuWeather kaže u svojoj dokumentaciji za jednodnevni API za predviđanje: 

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

Osnovni URL za prognozu uglavnom je konstantan, ali ovaj treba kod lokacije . Ako samo tražite prognozu za jedno mjesto, dobro, možete varati i koristiti web mjesto AccuWeather za traženje prognoze na Accuweather.com, a zatim provjeriti URL koji se vraća. Kada tražim poštanski broj 01701 (naš ured u Framinghamu, MA), vraća se sljedeći URL zajedno s prognozom: 

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

Vidite li /571_pcna kraju? To je ključ lokacije. Također možete koristiti AccuWeather Locations API za programsko izvlačenje kodova lokacija, što ću prikazati malo, ili jedan od AccuWeatherovih web alata Locations API kao što su City Search ili Postal Code Search. 

Izradite URL zahtjeva

Parametri upita za određene zahtjeve za podacima prikazuju se na kraju osnovnog URL-a. Prvi parametar započinje upitnikom iza kojeg slijedi naziv jednak vrijednosti. Svi dodatni parovi ključ / vrijednost dodaju se s znakom & iza kojeg slijedi ime jednako vrijednosti. Dakle, da bih dodao svoj API ključ, URL bi izgledao ovako:

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

Da želim dodati drugi parametar upita - recimo, mijenjajući zadane detalje s false na true - to bi izgledalo ovako:

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

Dohvati podatke

httr::GET()Funkciju možemo koristiti za izradu HTTP GETzahtjeva za taj URL, kao što je

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

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

Sys.getenv ("ACCUWEATHER_KEY"))

my_raw_result <- httr :: GET (my_url)

Ta je paste0()naredba za stvaranje URL-a slomila korijen URL-a u dva retka radi čitljivosti, a zatim je dodala API ključ pohranjen u varijablu okoline ACCUWEATHER_KEY R. 

my_raw_resultdonekle je složen popis. Stvarni podaci koje želimo uglavnom su sadržajni, ali ako pogledate njihovu strukturu, vidjet ćete da je to "sirovi" format koji izgleda poput binarnih podataka.

Sharon Machlis,

Srećom, paket httr olakšava pretvorbu iz sirovog u uporabljivi format - pomoću content()funkcije. 

Analizirajte rezultate

content()daje vam tri mogućnosti pretvorbe: kao sirovu (što u ovom slučaju definitivno nije korisno); raščlanjeno, što čini se da obično vraća nekakav popis; i tekst. Za JSON - posebno ugniježđeni JSON - smatram da je s tekstom najlakše raditi. Evo koda:

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

Tu dolazi paket jsonlite. fromJSON()Funkcija će pretvoriti JSON tekstualni niz content()u korisniji R objekt.

Evo djelomičnih rezultata pokretanja glimpse()funkcije dplyr my_contentda bi se dobio uvid u strukturu:

Sharon Machlis,

To je popis s dvije stavke. Prva stavka sadrži neke metapodatke i tekstualno polje koje bismo mogli željeti. Druga stavka je podatkovni okvir s puno podatkovnih točaka koje svakako želimo za prognozu. 

Izvođenje glimpse()samo na tom okviru podataka pokazuje da je ugniježđen JSON, jer su neki stupci zapravo njihovi vlastiti okviri podataka. Ali sve fromJSON()je to učinilo prilično besprijekornim.

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'

)

)

Vidite strukturu? GET()Funkcija uzima osnovni URL kao prvi argument i popis imena i vrijednosti kao drugi upit argument. Svaka je , s imenom bez navodnika. Ostatak koda je isti.name = value

To vrijedi i za AccuWeather Locations API.

Evo što API traži:

Sharon Machlis,

Mogu koristiti sličan kod kao s prognoziranim API, ali ovaj put s parametara upita apikeyi q, ključ AccuWeather i teksta mjesta tražim, odnosno:

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

ny_location_raw <- GET (osnovni_url,

upit = popis (apikey = Sys.getenv ("ACCUWEATHER_KEY"),

q = "New York, NY"

))

ny_parsed%

odJSON ()

Kôd lokacije nalazi se u stupcu Ključ.

> pogled (ny_parsed) Zapažanja: 1 Varijable: 15 $ Verzija 1 $ Ključ "349727" $ Tip "Grad" $ Rang 15 $ LocalizedName "New York" $ EnglishName "New York" $ PrimaryPostalCode "10007" $ Region $ Country $ AdministrativeArea $ TimeZone $ GeoPosition $ IsAlias ​​FALSE $ SupplementalAdminAreas []

Sada vam je potreban samo kôd za korištenje podataka koje ste izvukli iz API-ja.

Za više R savjeta, idite na stranicu "Učinite više s R" s tablicom članaka i videozapisa u kojima se može pretraživati.