Programavimas

Gaukite API duomenis naudodami R

Yra daugybė puikių R paketų, leidžiančių importuoti duomenis iš API su viena funkcija. Tačiau kartais API neturi jau parašytos funkcijos. Geros naujienos yra tai, kad lengva koduoti savo.

Aš tai pademonstruosiu su „AccuWeather“ API, tačiau procesas ir kodas veiks daugumai kitų API, kurie naudoja raktą autentifikavimui.

Prisiregistruokite gauti API prieigą

Jei norite sekti toliau, eikite į developer.accuweather.com ir užsiregistruokite gauti nemokamą paskyrą. Skiltyje „Paketai ir kainos“ pasirinkite ribotą bandomąjį laikotarpį, kuris leidžia 50 API skambučių per dieną - pakanka, jei norite tiesiog keletą kartų per dieną patikrinti vietinę prognozę, bet akivaizdu, kad tai nėra jokia viešai pritaikyta programa.

Jei jums ne iškart pateikiama galimybė sukurti programą, eikite į „Mano programos“ ir sukurkite naują programą.

Sharon Machlis,

Pasirinkau „Other“, kur bus naudojama API, „Internal App“ tam, ką kuriu, ir „Other“ - programavimo kalbai (deja, R nėra pasirinkimas). Jūsų programai turėtų būti priskirtas API raktas.

Jei nenorite koduoti šio API rakto į „AccuWeather“ prognozavimo scenarijų, išsaugokite jį kaip R aplinkos kintamąjį. Lengviausia tai padaryti naudojant šį paketą.usethis :: edit_r_environ ()atidaro jūsų R aplinkos failą redaguoti. Pridėkite tokią eilutę kaipACCUWEATHER_KEY = 'my_key_string' į tą failą, išsaugokite failą ir paleiskite R sesiją iš naujo. Dabar galite pasiekti pagrindinę vertę naudodami„Sys.getenv“ („ACCUWEATHER_KEY“) užuot sunkiai užkodavęs pačią vertę.

Nustatykite API URL struktūrą

Šiam projektui pirmiausia įkelsiu paketus „httr“, „jsonlite“ ir „dplyr“: „httr“, jei norite gauti duomenis iš API, „jsonlite“, kad juos analizuotumėte, ir „dplyr“, kad galiausiai naudotumėte vamzdžius (taip pat galite naudoti „magrittr“ paketą).

Kitas - ir tai labai svarbu turite žinoti, kaip susisteminti URL, kad galėtumėte paprašyti norimų duomenų iš API. Užklausos struktūros išsiaiškinimas gali būti sunkiausia proceso dalis, atsižvelgiant į tai, kaip gerai dokumentuota API. Laimei, „AccuWeather“ API dokumentai yra gana geri.

Bet kuriai API užklausai reikalingas ištekliaus URL arba tai, ką aš manau kaip URL šaknis, ir konkrečios užklausos dalys. Štai ką „AccuWeather“ sako vienos dienos prognozės API dokumentuose:

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

Pagrindinis prognozės URL dažniausiai yra pastovus, tačiau šiam reikia vietos kodas. Jei jūs tik ieškote vienos vietos prognozės, gerai, galite apgauti ir naudoti „AccuWeather“ svetainę, norėdami ieškoti prognozės accuweather.com ir tada patikrinti grįžusį URL. Kai ieškau pašto kodo 01701 (mūsų biuras Framinghame, MA), kartu su prognoze grįš šis URL:

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

Žr / 571_vnt pabaigoje? Tai yra vietos raktas. Taip pat galite naudoti „AccuWeather Locations“ API programiškai ištraukti vietovės kodus, kuriuos aš šiek tiek parodysiu, arba vieną iš „AccuWeather“ žiniatinklio „Locations“ API įrankių, tokių kaip „City Search“ arba „Postal Code Search“.

Sukurkite užklausos URL

Konkrečių duomenų užklausų užklausos parametrai pridedami prie pagrindinio URL pabaigos. Pirmasis parametras prasideda klaustuku, po kurio vardas yra lygus vertei. Visos papildomos raktų ir verčių poros pridedamos su ampersandu, po kurio nurodoma pavadinimas lygus vertei. Taigi norėdamas pridėti savo API raktą, URL atrodytų taip:

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

Jei norėčiau pridėti antrą užklausos parametrą - tarkime, pakeisdami numatytąją informaciją iš „false“ į „true“, tai atrodytų taip:

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

Gaukite duomenis

Mes galime naudoti httr :: GAUTI () funkcija sukurti HTTP GAUTI to URL užklausa, pvz

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

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

„Sys.getenv“ („ACCUWEATHER_KEY“)

my_raw_result <- httr :: GET (my_url)

Tai įklijuoti0 () komanda, sukūrusi URL, suskaidė URL šaknį į dvi eilutes, kad būtų lengviau ją skaityti, ir tada pridėjo API raktą, saugomą aplinkos kintamajame ACCUWEATHER_KEY R.

my_raw_result yra šiek tiek sudėtingas sąrašas. Tikrieji duomenys, kurių mes norime, daugiausia yra turinio, tačiau jei pažiūrėsite į jų struktūrą, pamatysite, kad tai yra „neapdorotas“ formatas, kuris atrodo kaip dvejetainiai duomenys.

Sharon Machlis,

Laimei, naudojant „httr“ paketą galima lengvai konvertuoti iš neapdoroto į naudingą formatą turinys() funkcija.

Analizuokite rezultatus

turinys() suteikia tris konversijos parinktis: kaip neapdorotą (kas šiuo atveju tikrai nėra naudinga); išanalizuotas, kuris, atrodo, paprastai pateikia tam tikrą sąrašą; ir tekstas. Manau, kad JSON - ypač įdėtą JSON - tekstą yra lengviausia dirbti. Štai kodas:

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

Čia yra „jsonlite“ paketas iš JSON () funkcija pavers JSON teksto eilutę iš turinys() į labiau pritaikomą R objektą.

Čia yra daliniai bėgimo dplyr rezultatai žvilgsnis () funkcija įjungta my_content sužinoti struktūrą:

Sharon Machlis,

Tai sąrašas su dviem elementais. Pirmajame elemente yra keletas metaduomenų ir teksto laukas, kurio galbūt norime. Antrasis elementas yra duomenų rėmas, kuriame yra daug duomenų taškų, kurių mes tikrai norime prognozuoti.

Bėgimas žvilgsnis () tik iš tų duomenų rėmelių matyti, kad jie buvo įdėti į JSON, nes kai kurie stulpeliai iš tikrųjų yra jų pačių duomenų rėmeliai. Bet iš JSON () padarė viską gana vientisą.

Stebėjimai: 1 Kintamieji: 8 $ Data "2019-08-29T07: 00: 00-04: 00" $ EpochDate 1567076400 $ Temperatūra $ Diena $ Naktis $ Šaltiniai ["AccuWeather"]

Taigi, tai yra pagrindiniai žingsniai norint gauti duomenis iš API:

  1. Išsiaiškinkite API pagrindinį URL ir užklausos parametrus ir sukurkite užklausos URL.
  2. Bėk httr :: GAUTI () URL.
  3. Analizuokite rezultatus naudodami turinys(). Galite pabandyti su as = 'išanalizuota', bet jei tai pateikia sudėtingą sąrašą, pabandykite as = 'tekstas'.
  4. Jei reikia, bėk jsonlite :: iš JSON () ant to išanalizuoto objekto.

Dar pora taškų, kol susivyniosime. Pirma, jei pažvelgsite dar kartą my_raw_result - iš pradinio objekto grįžo GAUTI - turėtumėte pamatyti būsenos kodą. 200 reiškia, kad viskas buvo gerai. Tačiau 400-ųjų kodas reiškia, kad kažkas negerai. Jei rašote funkciją ar scenarijų, prieš paleidžiant papildomą kodą, galite patikrinti, ar būsenos kodas yra 200-ųjų.

Antra, jei turite kelis užklausos parametrus, gali būti šiek tiek nemalonu juos visus susieti su a įklijuoti0 () komandą. GAUTI () turi kitą parinktį, kuri sukuria pavadintą užklausos argumentų sąrašą, pvz .:

my_raw_result2 <- GET (URL,

užklausa = sąrašas (

apikey = Sys.getenv ("ACCUWEATHER_KEY"),

išsami informacija = 'tiesa'

)

)

Matote struktūrą? GAUTI () funkcija ima pagrindinį URL kaip pirmąjį argumentą, o vardų ir reikšmių sąrašą - kaip antrąjį užklausos argumentą. Kiekvienas yra vardas = vertė, su pavadinimu ne kabutėse. Likusi kodo dalis yra ta pati.

Tai tinka ir „AccuWeather Locations“ API.

Štai ko ieško API:

Sharon Machlis,

Galiu naudoti panašų kodą kaip su prognozuojamu API, bet šį kartą su užklausos parametrais apikey ir q, „AccuWeather“ raktas ir ieškomos vietos tekstas:

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

ny_location_raw <- GET (bazinis_url,

užklausa = sąrašas (apikey = Sys.getenv ("ACCUWEATHER_KEY"),

q = "Niujorkas, NY"

))

ny_parsed%

iš JSON ()

Vietos kodas yra stulpelyje Raktas.

> žvilgsnis (ny_parsed) Pastebėjimai: 1 Kintamieji: 15 $ 1 versija $ Key "349727" $ tipas "City" $ Rank 15 $ LocalizedName "New York" $ EnglishName "New York" $ PrimaryPostalCode "10007" $ Region $ Country $ AdministrativeArea $ TimeZone $ GeoPosition $ IsAlias ​​FALSE $ SupplementalAdminAreas []

Dabar jums tereikia kodo, kad galėtumėte naudoti duomenis, kuriuos turite iš API.

Norėdami gauti daugiau R patarimų, eikite į puslapį „Daryk daugiau su R“ su straipsnių ir vaizdo įrašų lentele, kurioje galima ieškoti.

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