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.

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_pc
di 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 GET
permintaan 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_result
adalah 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.

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_content
untuk melihat strukturnya:

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:
- Figure out the API’s base URL and query parameters, and construct a request URL.
- Run
httr::GET()
on the URL. - Parse the results with
content()
. You can try it withas = 'parsed'
, but if that returns a complicated list, tryas = 'text'
. - 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:

Saya dapat menggunakan kod yang serupa dengan API ramalan, tetapi kali ini dengan parameter pertanyaan apikey
dan 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.