Dapatkan data API dengan R

Ada banyak paket R hebat yang memungkinkan Anda mengimpor data dari API dengan satu fungsi. Namun, terkadang API tidak memiliki fungsi yang sudah tertulis. Kabar baiknya adalah mudah untuk membuat kode milik Anda sendiri.

Saya akan mendemonstrasikan ini dengan AccuWeather API, tetapi proses dan kode akan berfungsi untuk sebagian besar API lain yang menggunakan kunci untuk otentikasi.

Daftar untuk akses API

Jika Anda ingin mengikutinya, buka developer.accuweather.com dan daftar untuk mendapatkan akun gratis. Di bawah Paket dan Harga, pilih Uji Coba Terbatas, yang memungkinkan 50 panggilan API per hari - cukup jika Anda hanya ingin memeriksa perkiraan lokal Anda beberapa kali sehari, tetapi jelas tidak untuk aplikasi publik apa pun.

Jika Anda tidak segera diberikan opsi untuk membuat aplikasi, buka Aplikasi Saya dan buat aplikasi baru.

Sharon Machlis,

Saya memilih Other untuk tempat API akan digunakan, Aplikasi Internal untuk apa yang saya buat, dan Lainnya untuk bahasa pemrograman (sayangnya, R bukanlah pilihan). Aplikasi Anda harus diberi kunci API.

Jika Anda tidak ingin memasukkan kunci API tersebut ke dalam skrip perkiraan AccuWeather, simpan sebagai variabel lingkungan R. Cara termudah untuk melakukannya adalah dengan menggunakan paket ini. usethis::edit_r_environ() membuka file lingkungan R Anda untuk mengedit. Tambahkan baris seperti  ACCUWEATHER_KEY = 'my_key_string'ke file itu, simpan file, dan mulai ulang sesi R. Anda sekarang dapat mengakses nilai kunci dengan Sys.getenv("ACCUWEATHER_KEY")alih -  alih mengkodekan nilai itu sendiri.

Tentukan struktur URL API

Untuk proyek ini, pertama-tama saya akan memuat paket httr, jsonlite, dan dplyr: httr untuk mendapatkan data dari API, jsonlite untuk menguraikannya, dan dplyr untuk akhirnya menggunakan pipa (Anda juga dapat menggunakan paket magrittr).

Selanjutnya - dan ini sangat penting - Anda perlu mengetahui cara menyusun URL untuk meminta data yang Anda inginkan dari API . Mencari tahu struktur kueri dapat menjadi bagian proses yang paling sulit, bergantung pada seberapa baik API didokumentasikan. Untungnya, dokumen API AccuWeather cukup bagus.

Kueri API apa pun membutuhkan URL sumber daya, atau yang saya anggap sebagai root URL, dan kemudian bagian spesifik dari kueri tersebut. Inilah yang dikatakan AccuWeather dalam dokumentasinya untuk API perkiraan satu hari: 

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

URL dasar untuk perkiraan sebagian besar tetap, tetapi yang ini membutuhkan kode lokasi . Jika Anda hanya mencari perkiraan untuk satu lokasi, Anda dapat menipu dan menggunakan situs web AccuWeather untuk mencari perkiraan di accuweather.com dan kemudian memeriksa URL yang kembali. Ketika saya mencari kode pos 01701 (kantor kami di Framingham, MA), URL berikut kembali bersama dengan ramalan: 

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

Lihat /571_pcakhirnya? Itulah kunci lokasinya. Anda juga dapat menggunakan API Lokasi AccuWeather untuk menarik kode lokasi secara terprogram, yang akan saya tampilkan sebentar lagi, atau salah satu alat API Lokasi berbasis Web AccuWeather seperti Pencarian Kota atau Pencarian Kode Pos. 

Buat URL permintaan

Parameter kueri untuk permintaan data tertentu ditempelkan di akhir URL dasar. Parameter pertama dimulai dengan tanda tanya diikuti nama sama dengan nilai. Setiap pasangan nilai kunci tambahan ditambahkan dengan ampersand diikuti dengan nama sama dengan nilai. Jadi untuk menambahkan kunci API saya, URL-nya akan terlihat seperti:

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

Jika saya ingin menambahkan parameter kueri kedua - misalnya, mengubah detail default dari salah menjadi benar - akan terlihat seperti ini:

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

Dapatkan datanya

Kita dapat menggunakan httr::GET()fungsi tersebut untuk membuat GETpermintaan HTTP dari URL itu, seperti

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

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

Sys.getenv ("ACCUWEATHER_KEY"))

my_raw_result <- httr :: GET (my_url)

Bahwa paste0()perintah menciptakan URL memecahkan akar URL menjadi dua baris untuk dibaca dan kemudian menambahkan kunci API disimpan dalam variabel lingkungan R ACCUWEATHER_KEY. 

my_raw_resultadalah daftar yang agak rumit. Data sebenarnya yang kami inginkan sebagian besar ada di konten, tetapi jika Anda melihat strukturnya, Anda akan melihat itu adalah format "mentah" yang terlihat seperti data biner.

Sharon Machlis,

Untungnya, paket httr memudahkan konversi dari format mentah ke format yang dapat digunakan - dengan content()fungsi tersebut. 

Parse hasilnya

content()memberi Anda tiga opsi konversi: sebagai mentah (yang pasti tidak membantu dalam kasus ini); parsed, yang tampaknya biasanya mengembalikan semacam daftar; dan teks. Untuk JSON - terutama JSON bersarang - menurut saya teks adalah yang paling mudah untuk dikerjakan. Ini kodenya:

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

Di sinilah paket jsonlite masuk. fromJSON()Fungsi ini akan mengubah string teks JSON content()menjadi objek R yang lebih bisa digunakan.

Berikut adalah hasil parsial dari menjalankan glimpse()fungsi dplyr untuk my_contentmelihat strukturnya:

Sharon Machlis,

Ini adalah daftar dengan dua item. Item pertama memiliki beberapa metadata dan bidang teks yang mungkin kita inginkan. Item kedua adalah bingkai data dengan banyak titik data yang pasti kami inginkan untuk ramalan. 

Berjalan glimpse()di bingkai data itu saja menunjukkan bahwa itu adalah JSON bersarang, karena beberapa kolom sebenarnya adalah bingkai datanya sendiri. Tapi fromJSON()membuat semuanya mulus.

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'

)

)

Lihat strukturnya? The GET()Fungsi mengambil URL dasar sebagai argumen pertama dan daftar nama dan nilai-nilai sebagai argumen query kedua. Masing-masing adalah , dengan nama tidak di dalam tanda petik. Sisa kodenya sama.name = value

Itu juga berfungsi untuk API Lokasi AccuWeather.

Inilah yang dicari API:

Sharon Machlis,

Saya dapat menggunakan kode yang mirip dengan API perkiraan, tetapi kali ini dengan parameter kueri apikeydan q, kunci AccuWeather, dan teks tempat yang saya cari, masing-masing:

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

ny_location_raw <- GET (base_url,

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

q = "New York, NY"

))

ny_parsed%

fromJSON ()

Kode lokasi ada di kolom Key.

> glimpse (ny_parsed) Pengamatan: 1 Variabel: 15 $ Versi 1 $ Kunci "349727" $ Ketik "Kota" $ Peringkat 15 $ LocalizedName "New York" $ EnglishName "New York" $ PrimaryPostalCode "10007" $ Region $ Country $ AdministrativeArea $ TimeZone $ GeoPosition $ IsAlias ​​FALSE $ SupplementalAdminAreas []

Sekarang yang Anda butuhkan hanyalah kode untuk menggunakan data yang telah Anda tarik dari API.

Untuk tips R lainnya, buka halaman "Lakukan Lebih Banyak Dengan R" dengan tabel artikel dan video yang dapat ditelusuri.