Programmering

Få API-data med R

Der er mange gode R-pakker, der giver dig mulighed for at importere data fra en API med en enkelt funktion. Imidlertid har en API undertiden ikke en allerede skrevet funktion. Den gode nyhed er, at det er let at kode din egen.

Jeg demonstrerer dette med AccuWeather API, men processen og koden fungerer for de fleste andre API'er, der bruger en nøgle til godkendelse.

Tilmeld dig API-adgang

Hvis du vil følge med, skal du gå til developer.accuweather.com og tilmelde dig en gratis konto. Vælg den begrænsede prøve under pakker og priser, som tillader 50 API-opkald om dagen - nok, hvis du bare vil kontrollere din lokale prognose et par gange om dagen, men selvfølgelig ikke til nogen form for offentligt ansøgning.

Hvis du ikke straks får mulighed for at oprette en app, skal du gå til Mine apps og oprette en ny app.

Sharon Machlis,

Jeg valgte Andet til hvor API'et skal bruges, Intern app til det, jeg opretter, og Andet til programmeringssprog (desværre er R ikke en mulighed). Din app skal tildeles en API-nøgle.

Hvis du ikke ønsker at kode denne API-nøgle ind i dit AccuWeather-prognoseskript, skal du gemme den som en R-miljøvariabel. Den nemmeste måde at gøre dette på er ved hjælp af denne pakke.bruger dette :: edit_r_environ ()åbner din R-miljøfil til redigering. Tilføj en linje som f.eksACCUWEATHER_KEY = 'min_nøgle_streng' til den fil, skal du gemme filen og genstarte din R-session. Du kan nu få adgang til nøgleværdien medSys.getenv ("ACCUWEATHER_KEY") i stedet for hårdkodning af selve værdien.

Bestem API's URL-struktur

Til dette projekt indlæser jeg først pakkerne httr, jsonlite og dplyr: httr for at hente data fra API'et, jsonlite til parsing af dem og dplyr til i sidste ende at bruge rør (du kan også bruge magrittr-pakken).

Næste - og dette er kritisk - du har brug for at vide, hvordan du strukturerer en URL for at kunne anmode om de data, du ønsker, fra API'et. At finde ud af forespørgselsstrukturen kan være den sværeste del af processen, afhængigt af hvor godt API'en er dokumenteret. Heldigvis er AccuWeather API-dokumenter ret gode.

Enhver API-forespørgsel har brug for en ressource-URL, eller hvad jeg tænker på som URL'ens rod, og derefter specifikke dele af forespørgslen. Her er hvad AccuWeather siger i dokumentationen til API-en-dags prognosen:

 //dataservice.accuweather.com / prognoser / v1 / dagligt / 1 dag / {locationKey} 

Basis-URL'en til en prognose er for det meste konstant, men denne har brug for en placeringskode. Hvis du bare leder efter en prognose for en placering, kan du snyde og bruge AccuWeather-webstedet til at søge efter en prognose på accuweather.com og derefter kontrollere den URL, der kommer tilbage. Når jeg søger efter postnummer 01701 (vores kontor i Framingham, MA), kommer følgende URL tilbage sammen med prognosen:

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

Se / 571_pc i slutningen? Det er placeringsnøglen. Du kan også bruge en AccuWeather Locations API til at trække placeringskoder programmatisk, som jeg viser lidt, eller et af AccuWeather's webbaserede API-værktøjer såsom City Search eller Postal Code Search.

Konstruer en anmodnings-URL

Forespørgselsparametre for specifikke dataforespørgsler bliver tacklet til slutningen af ​​en basis-URL. Den første parameter starter med et spørgsmålstegn efterfulgt af navnet er lig med værdien. Eventuelle yderligere nøgleværdipar tilføjes med et ampersand efterfulgt af navnet er lig med værdien. Så for at tilføje min API-nøgle ville URL'en se ud:

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

Hvis jeg ville tilføje en anden forespørgselsparameter - sig, at ændre standardoplysningerne fra falsk til sand - ville det se sådan ud:

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

Få dataene

Vi kan bruge httr :: GET () funktion til at oprette en HTTP anmodning fra denne URL, f.eks

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

"v1 / dagligt / 1 dag / 571_pc? apikey =",

Sys.getenv ("ACCUWEATHER_KEY"))

my_raw_result <- httr :: GET (my_url)

At indsæt0 () kommando, der opretter URL, brød URL-rod i to linjer for læsbarhed og tilføjede derefter API-nøglen, der er gemt i ACCUWEATHER_KEY R-miljøvariablen.

my_raw_result er en noget kompleks liste. De faktiske data, vi ønsker, er for det meste i indhold, men hvis du ser på dens struktur, vil du se, at det er et "rå" format, der ligner binære data.

Sharon Machlis,

Heldigvis gør httr-pakken det let at konvertere fra rå til et brugbart format - med indhold() fungere.

Parse resultaterne

indhold() giver dig tre konverteringsmuligheder: som rå (hvilket bestemt ikke er nyttigt i dette tilfælde); parset, hvilket normalt synes at returnere en slags liste; og tekst. For JSON - især indlejret JSON - finder jeg tekst at være den nemmeste at arbejde med. Her er koden:

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

Det er her, jsonlite-pakken kommer ind fraJSON () funktion vil slå en JSON tekststreng fra indhold() ind i et mere anvendeligt R-objekt.

Her er delvise resultater af kørsel af dplyr'er glimt () funktion til mit_indhold for at se strukturen:

Sharon Machlis,

Det er en liste med to emner. Det første element har nogle metadata og et tekstfelt, vi måske vil have. Det andet punkt er en dataramme med mange datapunkter, som vi bestemt vil have til prognosen.

Løb glimt () på netop den dataramme viser, at den var indlejret JSON, fordi nogle af kolonnerne faktisk er deres egne datarammer. Men fraJSON () gjorde det hele ret sømløst.

Observationer: 1 Variabler: 8 $ Dato "2019-08-29T07: 00: 00-04: 00" $ EpochDate 1567076400 $ Temperatur $ Dag $ Nat $ Kilder ["AccuWeather"]

Så dette er de grundlæggende trin til at trække data fra en API:

  1. Find ud af API's basis-URL og forespørgselsparametre, og konstruer en URL til anmodning.
  2. Løb httr :: GET () på webadressen.
  3. Parse resultaterne med indhold(). Du kan prøve det med som = 'analyseret', men hvis det returnerer en kompliceret liste, så prøv som = 'tekst'.
  4. Kør om nødvendigt jsonlite :: fromJSON () på den parsede genstand.

Et par flere point, inden vi afslutter. Først hvis du ser igen på my_raw_result - det oprindelige objekt returneret fra - du skal se en statuskode. En 200 betyder, at alt var OK. Men en kode i 400'erne betyder, at noget gik galt. Hvis du skriver en funktion eller et script, kan du kontrollere, om statuskoden er i 200'erne, før yderligere kode kører.

For det andet, hvis du har flere forespørgselsparametre, kan det blive lidt irriterende at stramme dem alle sammen med en indsæt0 () kommando. FÅ() har en anden mulighed, som opretter en navngivet liste over forespørgselsargumenter, såsom:

my_raw_result2 <- GET (url,

forespørgsel = liste (

apikey = Sys.getenv ("ACCUWEATHER_KEY"),

detaljer = 'sandt'

)

)

Se strukturen? Det FÅ() -funktionen tager basis-URL som det første argument og en liste med navne og værdier som det andet forespørgselsargument. Hver er det navn = værdi, med navnet ikke i anførselstegn. Resten af ​​koden er den samme.

Det fungerer også for AccuWeather Locations API.

Her er hvad API'en leder efter:

Sharon Machlis,

Jeg kan bruge lignende kode som med API'et, men denne gang med forespørgselsparametrene apikey og q, henholdsvis AccuWeather-tasten og teksten til det sted, jeg leder efter:

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

ny_location_raw <- GET (base_url,

forespørgsel = liste (apikey = Sys.getenv ("ACCUWEATHER_KEY"),

q = "New York, NY"

))

ny_parsed%

fraJSON ()

Placeringskoden er i nøglekolonnen.

> glimt (ny_parsed) Observationer: 1 variabler: 15 $ version 1 $ nøgle "349727" $ type "by" $ rang 15 $ lokaliseret navn "New York" $ engelsk navn "New York" $ PrimaryPostalCode "10007" $ region $ land $ administrativt område $ TimeZone $ GeoPosition $ IsAlias ​​FALSE $ SupplementalAdminAreas []

Nu skal du bare kode for at bruge de data, du har hentet fra API'et.

For flere R-tip, gå til siden "Gør mere med R" med en søgbar tabel med artikler og videoer.