Programmering

Få API-data med R

Det er mange flotte R-pakker som lar deg importere data fra en API med en enkelt funksjon. Noen ganger har en API imidlertid ikke en allerede skrevet funksjon. Den gode nyheten er at det er enkelt å kode dine egne.

Jeg vil demonstrere dette med AccuWeather API, men prosessen og koden vil fungere for de fleste andre API-er som bruker en nøkkel for autentisering.

Registrer deg for API-tilgang

Hvis du vil følge med, kan du gå til developer.accuweather.com og registrere deg for en gratis konto. Under Packages and Pricing, velg Limited Trial, som tillater 50 API-samtaler per dag - nok hvis du bare vil sjekke den lokale prognosen et par ganger om dagen, men åpenbart ikke for noen form for offentlig applikasjon.

Hvis du ikke umiddelbart får muligheten til å opprette en app, går du til Mine apper og oppretter en ny app.

Sharon Machlis,

Jeg valgte Annet for hvor API-en skal brukes, Intern app for det jeg lager, og Annet for programmeringsspråk (dessverre er R ikke et alternativ). Appen din skal tildeles en API-nøkkel.

Hvis du ikke vil hardkode API-nøkkelen i AccuWeather-prognoseskriptet, kan du lagre det som en R-miljøvariabel. Den enkleste måten å gjøre dette på er med denne pakken.bruker dette :: edit_r_environ ()åpner R-miljøfilen din for redigering. Legg til en linje somACCUWEATHER_KEY = 'min_nøkkelstreng' til den filen, lagre filen og start R-økten på nytt. Du kan nå få tilgang til nøkkelverdien medSys.getenv ("ACCUWEATHER_KEY") i stedet for hardkoding av selve verdien.

Bestem API-adressens struktur

For dette prosjektet vil jeg først laste inn pakkene httr, jsonlite og dplyr: httr for å få data fra API, jsonlite for å analysere dem og dplyr til slutt å bruke rør (du kan også bruke magrittr-pakken).

Neste - og dette er kritisk - du må vite hvordan du strukturerer en URL for å be om dataene du ønsker fra API. Å finne ut spørrestrukturen kan være den vanskeligste delen av prosessen, avhengig av hvor godt API er dokumentert. Heldigvis er AccuWeather API-dokumentene ganske bra.

Ethvert API-spørsmål trenger en ressurs-URL, eller det jeg tenker på som URL-adressen, og deretter bestemte deler av spørringen. Dette er hva AccuWeather sier i dokumentasjonen for API-en-dags prognosen:

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

Basis-URL-en for en prognose er stort sett konstant, men denne trenger en posisjonskode. Hvis du bare leter etter en prognose for ett sted, kan du jukse og bruke AccuWeather-nettstedet til å søke etter en prognose på accuweather.com og deretter sjekke nettadressen som kommer tilbake. Når jeg søker etter postnummer 01701 (vårt kontor i Framingham, MA), kommer følgende URL tilbake sammen med prognosen:

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

Se / 571_pc på slutten? Det er plasseringsnøkkelen. Du kan også bruke et API for AccuWeather Locations til å trekke posisjonskoder programmatisk, noe jeg vil vise litt om, eller et av AccuWeather's nettbaserte API-verktøy som City Search eller Postal Code Search.

Konstruer en URL for forespørsel

Spørsmålsparametere for spesifikke dataforespørsler blir slått fast på slutten av en grunn-URL. Den første parameteren starter med et spørsmålstegn etterfulgt av navnet er lik verdien. Eventuelle ekstra nøkkelverdipar legges til med et ampersand etterfulgt av navnet er lik verdien. Så for å legge til API-nøkkelen min, vil nettadressen se ut som:

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

Hvis jeg ønsket å legge til en andre spørringsparameter - si, endre standardopplysningene fra falsk til sann - ville det se slik ut:

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

Få dataene

Vi kan bruke httr :: GET () funksjon for å lage en HTTP forespørsel fra den nettadressen, for eksempel

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

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

Sys.getenv ("ACCUWEATHER_KEY"))

my_raw_result <- httr :: GET (my_url)

At lim inn 0 () kommando som opprettet URL brøt URL-roten i to linjer for lesbarhet, og la deretter til API-nøkkelen som er lagret i ACCUWEATHER_KEY R-miljøvariabelen.

my_raw_result er en litt kompleks liste. De faktiske dataene vi ønsker er for det meste i innhold, men hvis du ser på strukturen, vil du se at det er et "rå" format som ser ut som binær data.

Sharon Machlis,

Heldigvis gjør httr-pakken det enkelt å konvertere fra rå til brukbart format - med innhold() funksjon.

Analyser resultatene

innhold() gir deg tre konverteringsalternativer: som rå (som definitivt ikke er nyttig i dette tilfellet); analysert, som vanligvis ser ut til å returnere en slags liste; og tekst. For JSON - spesielt nestet JSON - synes jeg tekst er den enkleste å jobbe med. Her er koden:

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

Det er her jsonlite-pakken kommer inn fraJSON () funksjon vil slå en JSON tekststreng fra innhold() inn i et mer brukbart R-objekt.

Her er delvise resultater av å kjøre dplyr glimt () funksjon på mitt_innhold for å se på strukturen:

Sharon Machlis,

Det er en liste med to elementer. Det første elementet har noen metadata og et tekstfelt vi kanskje vil ha. Det andre elementet er en dataramme med mange datapunkter vi absolutt vil ha for prognosen.

Løping glimt () bare den datarammen viser at den var nestet JSON, fordi noen av kolonnene faktisk er deres egne datarammer. Men fraJSON () gjorde det ganske sømløst.

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

Så dette er de grunnleggende trinnene for å hente data fra en API:

  1. Finn ut API-enes grunnleggende URL og søkeparametere, og konstruer en URL for forespørsel.
  2. Løpe httr :: GET () på nettadressen.
  3. Analyser resultatene med innhold(). Du kan prøve det med som = 'analysert', men hvis det gir en komplisert liste, prøv som = 'tekst'.
  4. Kjør om nødvendig jsonlite :: fromJSON () på den analyserte gjenstanden.

Et par poeng til før vi avslutter. Først hvis du ser igjen på my_raw_result - det opprinnelige objektet returnerte fra - du bør se en statuskode. En 200 betyr at alt var OK. Men en kode på 400-tallet betyr at noe gikk galt. Hvis du skriver en funksjon eller et skript, kan du sjekke om statuskoden er på 200-tallet før ytterligere kode kjøres.

For det andre, hvis du har flere søkeparametere, kan det bli litt irriterende å streng dem alle sammen med en lim inn 0 () kommando. FÅ() har et annet alternativ, som oppretter en navngitt liste over spørringsargumenter, for eksempel:

my_raw_result2 <- GET (url,

spørring = liste (

apikey = Sys.getenv ("ACCUWEATHER_KEY"),

detaljer = 'sant'

)

)

Ser du strukturen? De FÅ() -funksjonen tar basis-URL som det første argumentet og en liste med navn og verdier som det andre spørringsargumentet. Hver og en er det Navn = verdi, med navnet ikke i anførselstegn. Resten av koden er den samme.

Det fungerer også for AccuWeather Locations API.

Dette ser API-et etter:

Sharon Machlis,

Jeg kan bruke lignende kode som med prognoseprogrammet, men denne gangen med spørsmålsparametrene apikey og q, henholdsvis AccuWeather-tasten og teksten til stedet jeg søker etter:

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

ny_location_raw <- GET (base_url,

spørring = liste (apikey = Sys.getenv ("ACCUWEATHER_KEY"),

q = "New York, NY"

))

ny_parsed%

fraJSON ()

Stedskoden er i nøkkelkolonnen.

> glimt (ny_parsed) Observasjoner: 1 variabler: 15 $ versjon 1 $ nøkkel "349727" $ Type "by" $ rangering 15 $ lokalisert navn "New York" $ engelsk navn "New York" $ PrimaryPostalCode "10007" $ region $ land $ administrativt område $ TimeZone $ GeoPosition $ IsAlias ​​FALSE $ SupplementalAdminAreas []

Nå trenger du bare kode for å bruke dataene du har hentet fra API-et.

For flere R-tips, gå til “Gjør mer med R” -siden med en søkbar tabell med artikler og videoer.

$config[zx-auto] not found$config[zx-overlay] not found