Uzyskaj dane API z R

Istnieje wiele świetnych pakietów języka R, które umożliwiają importowanie danych z interfejsu API za pomocą jednej funkcji. Jednak czasami API nie ma już napisanej funkcji. Dobra wiadomość jest taka, że ​​łatwo jest zaprogramować własne.

Pokażę to za pomocą interfejsu API AccuWeather, ale proces i kod będą działać w przypadku większości innych interfejsów API, które używają klucza do uwierzytelniania.

Zarejestruj się, aby uzyskać dostęp do interfejsu API

Jeśli chcesz kontynuować, wejdź na developer.accuweather.com i załóż darmowe konto. W sekcji Pakiety i ceny wybierz Ograniczoną wersję próbną, która zezwala na 50 wywołań interfejsu API dziennie - wystarczy, jeśli chcesz sprawdzić lokalną prognozę kilka razy dziennie, ale oczywiście nie w przypadku jakiejkolwiek publicznej aplikacji.

Jeśli nie pojawi się od razu opcja tworzenia aplikacji, przejdź do Moje aplikacje i utwórz nową aplikację.

Sharon Machlis,

Wybrałem opcję Inny dla miejsca, w którym będzie używany interfejs API, aplikację wewnętrzną do tego, co tworzę, i inną dla języka programowania (niestety R nie wchodzi w grę). Twoja aplikacja powinna mieć przypisany klucz API.

Jeśli nie chcesz na stałe zakodować tego klucza API w swoim skrypcie prognozy AccuWeather, zapisz go jako zmienną środowiskową R. Najłatwiej to zrobić, korzystając z tego pakietu. usethis::edit_r_environ() otwiera plik środowiska R do edycji. Dodaj wiersz, na przykład,  ACCUWEATHER_KEY = 'my_key_string'do tego pliku, zapisz plik i uruchom ponownie sesję języka R. Możesz teraz uzyskać dostęp do wartości klucza za pomocą  Sys.getenv("ACCUWEATHER_KEY")zamiast twardego kodowania samej wartości.

Określ strukturę adresu URL interfejsu API

W tym projekcie najpierw załaduję pakiety httr, jsonlite i dplyr: httr do pobierania danych z API, jsonlite do ich analizowania i dplyr, aby ostatecznie używać potoków (możesz również użyć pakietu magrittr).

Następnie - i to jest krytyczne - musisz wiedzieć, jak ustrukturyzować adres URL, aby zażądać żądanych danych z interfejsu API . Ustalenie struktury zapytania może być najtrudniejszą częścią procesu, w zależności od tego, jak dobrze udokumentowano API. Na szczęście dokumentacja AccuWeather API jest całkiem dobra.

Każde zapytanie API wymaga adresu URL zasobu lub tego, co uważam za katalog główny adresu URL, a następnie określonych części zapytania. Oto, co mówi AccuWeather w dokumentacji interfejsu API prognozy jednodniowej: 

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

Podstawowy adres URL prognozy jest w większości stały, ale ten wymaga kodu lokalizacji . Jeśli szukasz tylko prognozy dla jednej lokalizacji, możesz oszukać i użyć witryny AccuWeather do wyszukania prognozy na accuweather.com, a następnie sprawdzić powracający adres URL. Kiedy wyszukuję kod pocztowy 01701 (nasze biuro w Framingham, MA), pojawia się następujący adres URL wraz z prognozą: 

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

Widzisz /571_pcna końcu? To jest klucz lokalizacji. Możesz również użyć interfejsu API AccuWeather Locations do programowego pobierania kodów lokalizacji, co pokażę za chwilę, lub jednego z internetowych narzędzi interfejsu API lokalizacji AccuWeather, takich jak wyszukiwanie miasta lub wyszukiwanie kodów pocztowych. 

Utwórz adres URL żądania

Parametry zapytań dla określonych żądań danych są dołączane na końcu podstawowego adresu URL. Pierwszy parametr zaczyna się znakiem zapytania, po którym następuje nazwa równa się wartości. Wszelkie dodatkowe pary klucz-wartość są dodawane ze znakiem ampersand, po którym następuje nazwa równa się wartości. Aby dodać mój klucz API, adres URL wyglądałby następująco:

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

Gdybym chciał dodać drugi parametr zapytania - powiedzmy, zmieniając domyślne szczegóły z false na true - wyglądałoby to tak:

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

Zdobądź dane

Możemy użyć tej httr::GET()funkcji, aby wysłać GETżądanie HTTP z tego adresu URL, takie jak

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

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

Sys.getenv ("ACCUWEATHER_KEY"))

my_raw_result <- httr :: GET (moj_url)

Ta paste0()komenda tworząca adres URL podzieliła katalog główny adresu URL na dwie linie w celu zwiększenia czytelności, a następnie dodała klucz API przechowywany w zmiennej środowiskowej ACCUWEATHER_KEY R. 

my_raw_resultto dość złożona lista. Rzeczywiste dane, których potrzebujemy, znajdują się głównie w treści, ale jeśli spojrzysz na ich strukturę, zobaczysz, że jest to „surowy” format, który wygląda jak dane binarne.

Sharon Machlis,

Na szczęście pakiet httr ułatwia konwersję z formatu raw do użytecznego formatu - za pomocą content()funkcji. 

Przeanalizuj wyniki

content()daje trzy opcje konwersji: jako surowe (co zdecydowanie nie jest pomocne w tym przypadku); przeanalizowany, który wydaje się zwykle zwracać jakąś listę; i tekst. W przypadku formatu JSON - szczególnie zagnieżdżonego JSON - uważam, że tekst jest najłatwiejszy w obsłudze. Oto kod:

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

Tutaj pojawia się pakiet jsonlite. fromJSON()Funkcja zamieni ciąg tekstowy JSON z content()w bardziej użyteczny obiekt R.

Oto częściowe wyniki uruchomienia glimpse()funkcji dplyr w my_contentcelu obejrzenia struktury:

Sharon Machlis,

To lista z dwoma elementami. Pierwsza pozycja ma pewne metadane i pole tekstowe, które możemy chcieć. Drugi element to ramka danych z wieloma punktami danych, które zdecydowanie chcemy uwzględnić w prognozie. 

Uruchomienie glimpse()tylko tej ramki danych pokazuje, że był to zagnieżdżony JSON, ponieważ niektóre kolumny są w rzeczywistości ich własnymi ramkami danych. Ale fromJSON()sprawiło, że wszystko było całkiem bezproblemowe.

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'

)

)

Widzisz strukturę? GET()Funkcja przyjmuje podstawowy adres URL jako pierwszy argument i listę nazw i wartości jako drugi argument zapytania. Każdy z nich jest , z nazwą nie w cudzysłowie. Reszta kodu jest taka sama.name = value

Działa to również w przypadku interfejsu API AccuWeather Locations.

Oto czego szuka API:

Sharon Machlis,

Mogę użyć podobnego kodu jak w przypadku prognozy API, ale tym razem odpowiednio z parametrami zapytania apikeyi qkluczem AccuWeather oraz tekstem szukanego miejsca:

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

ny_location_raw <- GET (base_url,

query = list (apikey = Sys.getenv ("ACCUWEATHER_KEY"),

q = „Nowy Jork, NY”

))

ny_parsed%

fromJSON ()

Kod lokalizacji znajduje się w kolumnie Klucz.

> glimpse (ny_parsed) Obserwacje: 1 Zmienne: 15 $ Wersja 1 $ Klucz "349727" $ Typ "Miasto" $ Ranga 15 $ ZlokalizowaneNazwa "Nowy Jork" $ EnglishNazwa "Nowy Jork" $ PrimaryPostalCode "10007" $ Region $ Kraj $ Obszar administracyjny $ TimeZone $ GeoPosition $ IsAlias ​​FALSE $ SupplementalAdminAreas []

Teraz wszystko, czego potrzebujesz, to kod do korzystania z danych pobranych z interfejsu API.

Aby uzyskać więcej wskazówek dotyczących języka R, przejdź na stronę „Zrób więcej z językiem R”, na której znajduje się wyszukiwalna tabela artykułów i filmów.