Programiranje

Pridobite podatke API z R

Obstaja veliko odličnih paketov R, ki vam omogočajo uvoz podatkov iz API-ja z eno samo funkcijo. Vendar včasih API nima že napisane funkcije. Dobra novica je, da je enostavno kodirati svojega.

To bom prikazal z API-jem AccuWeather, vendar bosta postopek in koda delovala za večino drugih API-jev, ki za preverjanje pristnosti uporabljajo ključ.

Prijavite se za dostop do API-ja

Če želite nadaljevati, pojdite na developer.accuweather.com in se prijavite za brezplačen račun. V razdelku Paketi in cene izberite Omejena preizkusna različica, ki omogoča 50 klicev API na dan - dovolj, če želite le nekajkrat preveriti svojo lokalno napoved, vendar očitno ne za kakršno koli javno uporabniško aplikacijo.

Če vam možnost ustvarjanja aplikacije ne bo takoj predstavljena, pojdite v Moje aplikacije in ustvarite novo aplikacijo.

Sharon Machlis,

Izbral sem Drugo za to, kje bo uporabljen API, Interno aplikacijo za to, kar ustvarjam, in Drugo za programski jezik (na žalost R ni možnost). Vaša aplikacija mora dobiti ključ API.

Če tega ključa API ne želite trdo kodirati v skript napovedi AccuWeather, ga shranite kot spremenljivko okolja R. To najlažje storite s pomočjo tega paketa.usethis :: edit_r_environ ()odpre datoteko vašega okolja R za urejanje. Dodajte vrstico, na primerACCUWEATHER_KEY = 'my_key_string' v to datoteko shranite datoteko in znova zaženite R sejo. Zdaj lahko dostopate do vrednosti ključa zSys.getenv ("ACCUWEATHER_KEY") namesto trdega kodiranja same vrednosti.

Določite strukturo URL-jev API-ja

Za ta projekt bom najprej naložil pakete httr, jsonlite in dplyr: httr za pridobivanje podatkov iz API-ja, jsonlite za njihovo razčlenjevanje in dplyr za sčasoma uporabo cevi (lahko uporabite tudi paket magrittr).

Naprej - in to je ključnega pomena - morate vedeti, kako strukturirati URL, če želite od API-ja zahtevati želene podatke. Ugotovitev strukture poizvedbe je lahko najtežji del procesa, odvisno od tega, kako dobro je API dokumentiran. Na srečo so dokumenti AccuWeather API precej dobri.

Vsaka poizvedba API potrebuje URL vira ali kar je po mojem mnenju koren URL-ja in nato določene dele poizvedbe. AccuWeather pravi v svoji dokumentaciji za enodnevni API za napoved:

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

Osnovni URL za napoved je večinoma konstanten, vendar ta potrebuje lokacijska koda. Če iščete samo napoved za eno lokacijo, lahko goljufate in na spletnem mestu AccuWeather iščete napoved na Accuweather.com in nato preverite URL, ki se vrne. Ko iščem poštno številko 01701 (naša pisarna v Framinghamu, MA), se skupaj z napovedjo vrne naslednji URL:

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

Glej / 571_pc na koncu? To je lokacijski ključ. Za vlečenje lokacijskih kod lahko programsko uporabite tudi API AccuWeather Locations API, ki ga bom prikazal čez nekaj časa, ali eno od orodij API-jev lokacij AccuWeather, kot sta City Search ali Search ZIP.

Sestavite URL zahteve

Parametri poizvedbe za določene podatkovne zahteve se prilepijo na konec osnovnega URL-ja. Prvi parameter se začne z vprašajem, ki mu sledi ime enako vrednost. Vsi dodatni pari ključ / vrednost se dodajo z znakom &, čemur sledi ime enako vrednost. Če bi torej dodal svoj ključ API, bi bil URL videti tako:

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

Če bi želel dodati drugi parameter poizvedbe - recimo, spreminjanje privzetih podrobnosti iz false na true - bi bilo videti tako:

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

Pridobite podatke

Lahko uporabimo httr :: GET () funkcijo za izdelavo HTTP GET zahtevo tega URL-ja, kot je

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

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

Sys.getenv ("ACCUWEATHER_KEY"))

my_raw_result <- httr :: GET (moj_url)

To prilepi0 () Ukaz za ustvarjanje URL-ja je za berljivost razdelil koren URL-ja v dve vrstici in nato dodal ključ API, shranjen v spremenljivki okolja ACCUWEATHER_KEY R.

my_raw_result je nekoliko zapleten seznam. Dejanski podatki, ki jih želimo, so večinoma v vsebini, vendar če pogledate njihovo strukturo, boste videli, da gre za "surovo" obliko, ki je videti kot binarni podatki.

Sharon Machlis,

Na srečo paket httr olajša pretvorbo iz surovega v uporabno obliko - z vsebina () funkcijo.

Razčlenite rezultate

vsebina () ponuja tri možnosti pretvorbe: kot surovo (kar v tem primeru vsekakor ni v pomoč); razčlenjen, za katerega se zdi, da ponavadi vrne nekakšen seznam; in besedilo. Za JSON - še posebej ugnezdeni JSON - se mi zdi, da je besedilo najlažje delati. Tu je koda:

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

Tu pride paket jsonlite odJSON () funkcija bo pretvorila besedilni niz JSON iz vsebina () v uporabnejši R objekt.

Tu so delni rezultati izvajanja dplyrjev pogled () funkcija vklopljena my_content da si ogledate strukturo:

Sharon Machlis,

To je seznam z dvema postavkama. Prvi element ima nekaj metapodatkov in besedilno polje, ki bi ga morda želeli. Drugi element je podatkovni okvir z veliko podatkovnimi točkami, ki jih vsekakor želimo za napoved.

Tek pogled () prav na tem podatkovnem okviru je razvidno, da je bil ugnezden JSON, ker so nekateri stolpci pravzaprav lastni podatkovni okviri. Ampak odJSON () naredil vse precej brezhibno.

Opazovanja: 1 Spremenljivke: 8 $ Datum "2019-08-29T07: 00: 00-04: 00" $ EpochDate 1567076400 $ Temperatura $ Dan $ Noč $ Viri ["AccuWeather"]

To so osnovni koraki za vlečenje podatkov iz API-ja:

  1. Ugotovite osnovni URL in parametre poizvedbe API-ja ter sestavite URL zahteve.
  2. Teči httr :: GET () na URL.
  3. Razčlenite rezultate z vsebina (). Lahko poskusite z as = 'razčlenjeno', vendar če to vrne zapleten seznam, poskusite kot = 'besedilo'.
  4. Po potrebi teči jsonlite :: odJSON () na tem razčlenjenem predmetu.

Še nekaj točk, preden zaključimo. Najprej, če še enkrat pogledate my_raw_result - začetni predmet, vrnjen iz GET - videli bi kodo stanja. 200 pomeni, da je bilo vse v redu. Toda koda v 400-ih pomeni, da je šlo kaj narobe. Če pišete funkcijo ali skript, lahko pred zagonom dodatne kode preverite, ali je koda stanja v 200-ih.

Drugič, če imate več parametrov poizvedbe, je lahko nekoliko nadležno, če jih vse skupaj napišete z prilepi0 () ukaz. PRIDOBI () ima še eno možnost, ki je ustvarjanje imenovanega seznama argumentov poizvedbe, na primer:

my_raw_result2 <- GET (url,

query = seznam (

apikey = Sys.getenv ("ACCUWEATHER_KEY"),

podrobnosti = 'true'

)

)

Vidiš strukturo? The PRIDOBI () funkcija vzame osnovni URL kot prvi argument, seznam imen in vrednosti pa kot drugi argument poizvedbe. Vsak je ime = vrednost, z imenom ne v narekovajih. Preostala koda je enaka.

To deluje tudi za API AccuWeather Locations.

Tukaj išče API:

Sharon Machlis,

Lahko uporabim podobno kodo kot pri API-ju za napoved, tokrat pa s parametri poizvedbe apikey in q, tipka AccuWeather in besedilo kraja, ki ga iščem:

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

ny_location_raw <- GET (base_url,

poizvedba = seznam (apikey = Sys.getenv ("ACCUWEATHER_KEY"),

q = "New York, NY"

))

ny_parsed%

odJSON ()

Lokacijska koda je v stolpcu Ključ.

> pogled (ny_parsed) Opazovanja: 1 Spremenljivke: 15 $ Različica 1 $ Ključ "349727" $ Tip "Mesto" $ Mesto 15 $ LocalizedName "New York" $ EnglishName "New York" $ PrimaryPostalCode "10007" $ Regija $ Država $ AdministrativeArea $ TimeZone $ GeoPosition $ IsAlias ​​FALSE $ SupplementalAdminAreas []

Zdaj potrebujete samo kodo za uporabo podatkov, ki ste jih povlekli iz API-ja.

Če želite več nasvetov za R, pojdite na stran »Naredite več z R« s pregledno tabelo člankov in videoposnetkov.

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