Вземете API данни с R

Има много страхотни R пакети, които ви позволяват да импортирате данни от API с една функция. Понякога обаче API няма вече написана функция. Добрата новина е, че е лесно да кодирате своя.

Ще демонстрирам това с AccuWeather API, но процесът и кодът ще работят за повечето други API, които използват ключ за удостоверяване.

Регистрирайте се за достъп до API

Ако искате да продължите, отидете на developer.accuweather.com и се регистрирайте за безплатен акаунт. Под Пакети и ценообразуване изберете Ограничен пробен период, който позволява 50 API повиквания на ден - достатъчно, ако просто искате да проверявате местната прогноза няколко пъти на ден, но очевидно не за някакво публично приложение.

Ако не сте веднага представени с опция за създаване на приложение, отидете на Моите приложения и създайте ново приложение.

Шарън Маклис,

Избрах Други за това къде ще се използва API, Вътрешно приложение за това, което създавам и Друго за език за програмиране (за съжаление, R не е опция). На вашето приложение трябва да бъде присвоен API ключ.

Ако не искате да кодирате този ключ на API във вашия скрипт за прогноза AccuWeather, запазете го като променлива на R среда. Най-лесният начин да направите това е с този пакет. usethis::edit_r_environ() отваря вашия R среда файл за редактиране. Добавете ред като този  ACCUWEATHER_KEY = 'my_key_string'към този файл, запазете файла и рестартирайте R сесията. Вече можете да осъществите достъп до ключовата стойност  Sys.getenv("ACCUWEATHER_KEY")вместо с кодиране на самата стойност.

Определете URL структурата на API

За този проект първо ще заредя пакетите httr, jsonlite и dplyr: httr за получаване на данни от API, jsonlite за анализирането им и dplyr за евентуално използване на тръби (можете да използвате и пакета magrittr).

След това - и това е критично - трябва да знаете как да структурирате URL адрес, за да поискате данните, които искате от API . Определянето на структурата на заявката може да бъде най-трудната част от процеса, в зависимост от това колко добре е документиран API. За щастие, документите за API на AccuWeather са доста добри.

Всяка заявка за API се нуждае от URL адрес на ресурс или това, което мисля като корен на URL адреса, и след това конкретни части на заявката. Ето какво казва AccuWeather в документацията си за еднодневния API за прогноза: 

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

Основният URL адрес за прогноза е предимно постоянен, но този се нуждае от код за местоположение . Ако просто търсите прогноза за едно местоположение, добре, можете да измамите и да използвате уебсайта AccuWeather, за да търсите прогноза на Accuweather.com и след това да проверите URL адреса, който се връща. Когато търся пощенски код 01701 (нашият офис във Фрамингам, Масачузетс), следният URL се връща заедно с прогнозата: 

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

Виждате ли /571_pcв края? Това е ключът за местоположението. Можете също така да използвате API на AccuWeather Locations, за да изтеглите програмно кодовете на местоположението, което ще покажа след малко, или един от инструментите на API за локации на AccuWeather, като например Търсене на град или Пощенски код. 

Създайте URL адрес на заявка

Параметрите на заявката за конкретни заявки за данни се прикрепват към края на основния URL адрес. Първият параметър започва с въпросителен знак, последван от име е равно на стойност. Всички допълнителни двойки ключ-стойност се добавят с амперсанд, последван от име, равно на стойност. Така че, за да добавя моя API ключ, URL адресът ще изглежда така:

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

Ако исках да добавя втори параметър на заявката - да речем, промяна на данните по подразбиране от false на true - това би изглеждало така:

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

Вземете данните

Можем да използваме httr::GET()функцията, за да направим HTTP GETзаявка за този URL адрес, като например

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

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

Sys.getenv ("ACCUWEATHER_KEY"))

my_raw_result <- httr :: GET (my_url)

Тази paste0()команда, създаваща URL адреса, разби URL корена на два реда за четливост и след това добави API ключа, съхраняван в променливата на средата ACCUWEATHER_KEY R. 

my_raw_resultе малко сложен списък. Действителните данни, които искаме, са предимно в съдържание, но ако погледнете структурата им, ще видите, че това е „суров“ формат, който прилича на двоични данни.

Шарън Маклис,

За щастие, пакетът httr улеснява конвертирането от суров в използваем формат - с content()функцията. 

Анализирайте резултатите

content()ви дава три опции за преобразуване: като сурово (което определено не е полезно в този случай); анализиран, който изглежда обикновено връща някакъв списък; и текст. За JSON - особено вложен JSON - намирам, че текстът е най-лесният за работа. Ето кода:

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

Тук идва пакетът jsonlite. fromJSON()Функцията ще превърне текстов низ от JSON content()в по-използваем R обект.

Ето частични резултати от изпълнението на glimpse()функцията на dplyr, за my_contentда разгледаме структурата:

Шарън Маклис,

Това е списък с два елемента. Първият елемент има някои метаданни и текстово поле, което може да искаме. Вторият елемент е рамка за данни с много точки от данни, които определено искаме за прогнозата. 

Изпълнението glimpse()само на този кадър от данни показва, че е вложен JSON, защото някои от колоните всъщност са техни собствени рамки за данни. Но fromJSON()направи всичко това доста безпроблемно.

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'

)

)

Виждате ли структурата? Най- GET()функцията е на база URL като първи аргумент и списък с имена и ценности като вторият аргумент на заявката. Всеки е , като името не е в кавички. Останалата част от кода е същата.name = value

Това работи и за API на AccuWeather Locations.

Ето какво търси API:

Шарън Маклис,

Мога да използвам подобен код като при API за прогноза, но този път съответно с параметрите на заявката apikeyи q, бутона AccuWeather и текста на мястото, което търся:

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

ny_location_raw <- GET (base_url,

заявка = списък (apikey = Sys.getenv ("ACCUWEATHER_KEY"),

q = "Ню Йорк, Ню Йорк"

))

ny_parsed%

отJSON ()

Кодът за местоположение е в колоната Ключ.

> поглед (ny_parsed) Наблюдения: 1 Променливи: 15 $ Версия 1 $ Ключ "349727" $ Тип "Град" $ Ранг 15 $ LocalizedName "Ню Йорк" $ EnglishName "Ню Йорк" $ PrimaryPostalCode "10007" $ Регион $ Държава $ Административна площ $ TimeZone $ GeoPosition $ IsAlias ​​FALSE $ SupplementalAdminAreas []

Сега ви трябва само код, за да използвате данните, които сте изтеглили от API.

За повече съвети за R отидете на страницата „Направете повече с R“ с таблица със статии и видеоклипове, която може да се търси.