Dapatkan data API dengan R

Terdapat banyak pakej R hebat yang membolehkan anda mengimport data dari API dengan satu fungsi. Namun, kadangkala API tidak mempunyai fungsi yang sudah ditulis. Berita baiknya adalah mudah untuk membuat kod anda sendiri.

Saya akan menunjukkan ini dengan API AccuWeather, tetapi proses dan kodnya akan berfungsi untuk kebanyakan API lain yang menggunakan kunci untuk pengesahan.

Daftar untuk akses API

Sekiranya anda ingin mengikuti, pergi ke developer.accuweather.com dan daftar untuk mendapatkan akaun percuma. Di bawah Pakej dan Harga, pilih Percubaan Terhad, yang membolehkan 50 panggilan API setiap hari - cukup jika anda hanya ingin memeriksa ramalan tempatan anda beberapa kali sehari, tetapi jelas bukan untuk jenis aplikasi yang dihadapi orang ramai.

Sekiranya anda tidak segera diberi pilihan untuk membuat aplikasi, buka Aplikasi Saya dan buat aplikasi baru.

Sharon Machlis,

Saya memilih Lain untuk di mana API akan digunakan, Aplikasi Dalaman untuk apa yang saya buat, dan Lainnya untuk bahasa pengaturcaraan (sayangnya, R bukanlah pilihan). Aplikasi anda harus diberikan kunci API.

Sekiranya anda tidak mahu memasukkan kode API ke dalam skrip ramalan AccuWeather anda, simpan sebagai pemboleh ubah persekitaran R. Kaedah termudah untuk melakukannya adalah dengan menggunakan pakej ini. usethis::edit_r_environ() membuka fail persekitaran R anda untuk diedit. Tambahkan baris seperti  ACCUWEATHER_KEY = 'my_key_string'ke fail itu, simpan fail, dan mulakan semula sesi R anda. Anda kini boleh mengakses nilai kunci dengan  Sys.getenv("ACCUWEATHER_KEY")bukannya mengekodkan nilai itu sendiri.

Tentukan struktur URL API

Untuk projek ini, saya akan memuatkan pakej httr, jsonlite, dan dplyr terlebih dahulu: httr untuk mendapatkan data dari API, jsonlite untuk menghuraikannya, dan dplyr untuk akhirnya menggunakan paip (anda juga boleh menggunakan pakej magrittr).

Seterusnya - dan ini penting - anda perlu mengetahui cara menyusun URL untuk meminta data yang anda inginkan dari API . Memahami struktur pertanyaan boleh menjadi bahagian paling sulit dari proses ini, bergantung pada seberapa baik API didokumentasikan. Nasib baik, dokumen AccuWeather API cukup bagus.

Sebarang pertanyaan API memerlukan URL sumber, atau apa yang saya fikirkan sebagai akar URL, dan kemudian bahagian tertentu dari pertanyaan. Inilah yang dikatakan oleh AccuWeather dalam dokumentasinya untuk API ramalan satu hari: 

 //dataservice.accuweather.com / ramalan / v1 / setiap hari / 1 hari / {locationKey} 

URL asas untuk ramalan kebanyakannya tetap, tetapi ini memerlukan kod lokasi . Sekiranya anda hanya mencari ramalan untuk satu lokasi, anda boleh menipu dan menggunakan laman web AccuWeather untuk mencari ramalan di accuweather.com dan kemudian periksa URL yang kembali. Semasa saya mencari poskod 01701 (pejabat kami di Framingham, MA), URL berikut kembali bersama dengan ramalan: 

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

Lihat /571_pcdi akhir? Itulah kunci lokasi. Anda juga boleh menggunakan AccuWeather Locations API untuk menarik kod lokasi secara program, yang akan saya tunjukkan sedikit, atau salah satu alat API Lokasi Web berasaskan AccuWeather seperti Carian Bandar atau Carian Poskod. 

Bina URL permintaan

Parameter pertanyaan untuk permintaan data tertentu diselesaikan pada akhir URL asas. Parameter pertama dimulakan dengan tanda tanya diikuti dengan nama sama dengan nilai. Mana-mana pasangan kunci-nilai tambahan ditambah dengan ampersand diikuti dengan nama sama dengan nilai. Jadi untuk menambahkan kunci API saya, URL akan kelihatan seperti:

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

Sekiranya saya ingin menambahkan parameter pertanyaan kedua - katakanlah, menukar butiran lalai dari palsu menjadi benar - ia akan kelihatan seperti ini:

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

Dapatkan data

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

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

"v1 / harian / 1 hari / 571_pc? apikey =",

Sys.getenv ("ACCUWEATHER_KEY"))

my_raw_result <- httr :: DAPATKAN (my_url)

Bahawa paste0()perintah mewujudkan URL memecahkan akar URL ke dalam dua baris untuk pembacaan dan kemudian ditambah kunci API yang disimpan dalam variabel persekitaran R ACCUWEATHER_KEY. 

my_raw_resultadalah senarai yang agak rumit. Data sebenar yang kami mahukan kebanyakan terdapat dalam kandungan, tetapi jika anda melihat strukturnya, anda akan melihatnya adalah format "mentah" yang kelihatan seperti data binari.

Sharon Machlis,

Nasib baik, pakej httr memudahkan untuk menukar dari mentah ke format yang boleh digunakan - dengan content()fungsinya. 

Huraikan hasilnya

content()memberi anda tiga pilihan penukaran: sebagai mentah (yang pastinya tidak membantu dalam kes ini); dihuraikan, yang nampaknya biasanya mengembalikan semacam senarai; dan teks. Untuk JSON - terutamanya JSON bersarang - saya dapati teks paling senang digunakan. Inilah kodnya:

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

Di sinilah pakej jsonlite masuk. fromJSON()Fungsi akan mengubah rentetan teks JSON dari content()menjadi objek R yang lebih berguna.

Berikut adalah sebahagian hasil menjalankan glimpse()fungsi dplyr my_contentuntuk melihat strukturnya:

Sharon Machlis,

Ini senarai dengan dua item. Item pertama mempunyai beberapa metadata dan medan teks yang mungkin kita mahukan. Item kedua adalah kerangka data dengan banyak titik data yang kita pasti mahukan ramalannya. 

Berjalan glimpse()hanya pada bingkai data yang menunjukkan ia adalah JSON bersarang, kerana beberapa lajur sebenarnya adalah bingkai data mereka sendiri. Tetapi fromJSON()menjadikan semuanya cukup lancar.

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? Yang GET()fungsi mengambil URL asas sebagai hujah pertama dan senarai nama dan nilai-nilai sebagai pertanyaan hujah kedua. Masing-masing adalah , dengan nama tidak dalam tanda petik. Selebihnya kodnya sama.name = value

Itu juga berfungsi untuk API Lokasi AccuWeather.

Inilah yang dicari oleh API:

Sharon Machlis,

Saya dapat menggunakan kod yang serupa dengan API ramalan, tetapi kali ini dengan parameter pertanyaan apikeydan q, kunci AccuWeather dan teks tempat yang saya cari, masing-masing:

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

ny_location_raw <- DAPATKAN (base_url,

pertanyaan = senarai (apikey = Sys.getenv ("ACCUWEATHER_KEY"),

q = "New York, NY"

))

ny_parsed%

dariJSON ()

Kod lokasi ada di lajur Kunci.

> glimpse (ny_parsed) Pemerhatian: 1 Pemboleh ubah: 15 $ Versi 1 $ Key "349727" $ Type "City" $ Rank 15 $ LocalizedName "New York" $ EnglishName "New York" $ PrimaryPostalCode "10007" $ Region $ Country $ AdministrativeArea $ TimeZone $ GeoPosition $ IsAlias ​​SALAH $ TambahanAdminAreas []

Sekarang yang anda perlukan hanyalah kod untuk menggunakan data yang telah anda tarik dari API.

Untuk lebih banyak petua R, buka halaman "Lakukan Lebih Banyak Dengan R" dengan jadual artikel dan video yang dapat dicari.