Προγραμματισμός

Λήψη δεδομένων API με R

Υπάρχουν πολλά υπέροχα πακέτα R που σας επιτρέπουν να εισάγετε δεδομένα από ένα API με μία μόνο λειτουργία. Ωστόσο, μερικές φορές ένα API δεν έχει ήδη γραπτή λειτουργία. Τα καλά νέα είναι ότι είναι εύκολο να κωδικοποιήσετε τη δική σας.

Αυτό θα το επιδείξω με το API AccuWeather, αλλά η διαδικασία και ο κώδικας θα λειτουργήσουν για τα περισσότερα άλλα API που χρησιμοποιούν ένα κλειδί για έλεγχο ταυτότητας.

Εγγραφείτε για πρόσβαση στο API

Αν θέλετε να ακολουθήσετε, μεταβείτε στη διεύθυνση developer.accuweather.com και εγγραφείτε για δωρεάν λογαριασμό. Στην ενότητα Πακέτα και τιμολόγηση, επιλέξτε την Περιορισμένη δοκιμή, η οποία επιτρέπει 50 κλήσεις API ανά ημέρα - αρκετά αν θέλετε απλώς να ελέγχετε την τοπική πρόβλεψη μερικές φορές την ημέρα, αλλά προφανώς όχι για οποιοδήποτε είδος δημόσιας εφαρμογής.

Εάν δεν σας παρουσιάζεται αμέσως η επιλογή δημιουργίας μιας εφαρμογής, μεταβείτε στην ενότητα Οι εφαρμογές μου και δημιουργήστε μια νέα εφαρμογή.

Sharon Machlis,

Επέλεξα Άλλο για το πού θα χρησιμοποιηθεί το API, Εσωτερική εφαρμογή για αυτό που δημιουργώ και Άλλο για τη γλώσσα προγραμματισμού (δυστυχώς, το R δεν είναι επιλογή). Στην εφαρμογή σας πρέπει να εκχωρηθεί κλειδί API.

Εάν δεν θέλετε να κωδικοποιήσετε αυτό το κλειδί API στο σενάριο πρόβλεψης AccuWeather, αποθηκεύστε το ως μεταβλητή περιβάλλοντος R. Ο ευκολότερος τρόπος για να το κάνετε αυτό είναι με το πακέτο usethis.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 / προβλέψεις / v1 / καθημερινή / 1 ημέρα / {locationKey} 

Το βασικό URL για μια πρόβλεψη είναι ως επί το πλείστον σταθερό, αλλά αυτό χρειάζεται ένα κωδικός τοποθεσίας. Αν ψάχνετε απλώς για μια πρόβλεψη για μία τοποθεσία, μπορείτε, επίσης, να εξαπατήσετε και να χρησιμοποιήσετε τον ιστότοπο AccuWeather για να αναζητήσετε μια πρόβλεψη στο accuweather.com και, στη συνέχεια, ελέγξτε τη διεύθυνση URL που επιστρέφει. Όταν αναζητώ τον ταχυδρομικό κώδικα 01701 (το γραφείο μας στο Framingham, MA), επιστρέφεται η ακόλουθη διεύθυνση URL μαζί με την πρόβλεψη:

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

Δείτε το / 571_pc στο τέλος? Αυτό είναι το κλειδί τοποθεσίας. Μπορείτε επίσης να χρησιμοποιήσετε ένα API τοποθεσιών AccuWeather για να τραβήξετε κωδικούς τοποθεσίας μέσω προγραμματισμού, τους οποίους θα εμφανίσω σε λίγο, ή ένα από τα εργαλεία 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 ΠΑΙΡΝΩ αίτημα αυτής της διεύθυνσης URL, όπως

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

"v1 / καθημερινή / 1ημέρα / 571_pc? apikey =",

Sys.getenv ("ACCUWEATHER_KEY"))

my_raw_result <- httr :: GET (my_url)

Οτι επικόλληση0 () Η εντολή δημιουργίας του URL έσπασε τη ρίζα του URL σε δύο γραμμές για αναγνωσιμότητα και στη συνέχεια πρόσθεσε το κλειδί API που είναι αποθηκευμένο στη μεταβλητή περιβάλλοντος ACCUWEATHER_KEY R.

my_raw_result είναι μια κάπως περίπλοκη λίστα. Τα πραγματικά δεδομένα που θέλουμε είναι κυρίως περιεχόμενο, αλλά αν κοιτάξετε τη δομή του, θα δείτε ότι είναι μια "ανεπεξέργαστη" μορφή που μοιάζει με δυαδικά δεδομένα.

Sharon Machlis,

Ευτυχώς, το πακέτο httr καθιστά εύκολη τη μετατροπή από ακατέργαστη σε χρησιμοποιήσιμη μορφή - με το περιεχόμενο() λειτουργία.

Αναλύστε τα αποτελέσματα

περιεχόμενο() σας δίνει τρεις επιλογές μετατροπής: ως ακατέργαστες (που σίγουρα δεν είναι χρήσιμες σε αυτήν την περίπτωση). ανάλυση, η οποία φαίνεται να επιστρέφει συνήθως κάποιο είδος λίστας. και κείμενο. Για το JSON - ειδικά το ένθετο JSON - θεωρώ ότι το κείμενο είναι το πιο εύκολο στην εργασία. Εδώ είναι ο κωδικός:

my_content <- httr :: content (my_raw_result, as = 'κείμενο')

Εδώ μπαίνει το πακέτο jsonlite απόJSON () Η συνάρτηση θα μετατρέψει μια συμβολοσειρά κειμένου JSON από περιεχόμενο() σε ένα πιο εύχρηστο αντικείμενο R.

Ακολουθούν μερικά αποτελέσματα της λειτουργίας του dplyr's ματιά() λειτουργία ενεργοποιημένη Περιεχόμενο_ για να ρίξετε μια ματιά στη δομή:

Sharon Machlis,

Είναι μια λίστα με δύο στοιχεία. Το πρώτο στοιχείο έχει ορισμένα μεταδεδομένα και ένα πεδίο κειμένου που ίσως θέλουμε. Το δεύτερο στοιχείο είναι ένα πλαίσιο δεδομένων με πολλά σημεία δεδομένων που σίγουρα θέλουμε για την πρόβλεψη.

Τρέξιμο ματιά() σε αυτό ακριβώς το πλαίσιο δεδομένων δείχνει ότι ήταν ένθετο JSON, επειδή ορισμένες από τις στήλες είναι στην πραγματικότητα τα δικά τους πλαίσια δεδομένων. Αλλά απόJSON () τα έκανε όλα απρόσκοπτα.

Παρατηρήσεις: 1 μεταβλητές: 8 $ Ημερομηνία "2019-08-29T07: 00: 00-04: 00" $ EpochDate 1567076400 $ Temperature $ Day $ Night $ Πηγές ["AccuWeather"]

Αυτά είναι λοιπόν τα βασικά βήματα για τη λήψη δεδομένων από ένα API:

  1. Βρείτε τη βασική διεύθυνση URL και τις παραμέτρους ερωτήματος του API και δημιουργήστε μια διεύθυνση URL αιτήματος.
  2. Τρέξιμο httr :: GET () στη διεύθυνση URL.
  3. Αναλύστε τα αποτελέσματα με περιεχόμενο(). Μπορείτε να το δοκιμάσετε με ως = "αναλυμένο", αλλά αν επιστρέψει μια περίπλοκη λίστα, δοκιμάστε ως = "κείμενο".
  4. Εάν είναι απαραίτητο, εκτελέστε jsonlite :: απόJSON () σε αυτό το αναλυμένο αντικείμενο.

Μερικά περισσότερα σημεία πριν ολοκληρώσουμε. Πρώτον, αν κοιτάξετε ξανά my_raw_result - το αρχικό αντικείμενο επέστρεψε από ΠΑΙΡΝΩ - θα πρέπει να δείτε έναν κωδικό κατάστασης. Το 200 σημαίνει ότι όλα ήταν εντάξει. Αλλά ένας κωδικός στα 400 σημαίνει ότι κάτι πήγε στραβά. Εάν γράφετε μια συνάρτηση ή ένα σενάριο, μπορείτε να ελέγξετε εάν ο κωδικός κατάστασης βρίσκεται στη δεκαετία του 200 πριν εκτελεστεί ο πρόσθετος κώδικας.

Δεύτερον, εάν έχετε πολλές παραμέτρους ερωτημάτων, μπορεί να είναι λίγο ενοχλητικό να τα δέσετε όλα μαζί με ένα επικόλληση0 () εντολή. ΠΑΙΡΝΩ() έχει μια άλλη επιλογή, η οποία δημιουργεί μια ονομαστική λίστα ορισμάτων ερωτημάτων, όπως:

my_raw_result2 <- GET (διεύθυνση URL,

ερώτημα = λίστα (

apikey = Sys.getenv ("ACCUWEATHER_KEY"),

λεπτομέρειες = "true"

)

)

Βλέπετε τη δομή; ο ΠΑΙΡΝΩ() Η συνάρτηση παίρνει τη βασική διεύθυνση URL ως το πρώτο όρισμα και μια λίστα ονομάτων και τιμών ως το δεύτερο όρισμα ερωτήματος. Κάθε ένα είναι όνομα = αξία, με το όνομα δεν σε εισαγωγικά. Ο υπόλοιπος κωδικός είναι ο ίδιος.

Αυτό λειτουργεί και για το AccuWeather Locations API.

Αυτό ψάχνει το API:

Sharon Machlis,

Μπορώ να χρησιμοποιήσω παρόμοιο κώδικα με το API πρόβλεψης, αλλά αυτή τη φορά με τις παραμέτρους του ερωτήματος Αϊκέι και ε, το κλειδί 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 ()

Ο κωδικός τοποθεσίας βρίσκεται στη στήλη Κλειδί.

> glimpse (ny_parsed) Παρατηρήσεις: 1 Μεταβλητές: 15 $ Έκδοση 1 $ Key "349727" $ Type "City" $ Rank 15 $ LocalizedName "New York" $ EnglishName "New York" $ PrimaryPostalCode "10007" $ Region $ Country $ Διοικητική περιοχή $ TimeZone $ GeoPosition $ IsAlias ​​FALSE $ SupplementalAdminAreas []

Τώρα το μόνο που χρειάζεστε είναι κωδικός για να χρησιμοποιήσετε τα δεδομένα που έχετε τραβήξει από το API.

Για περισσότερες συμβουλές R, μεταβείτε στη σελίδα "Do More With R" με έναν πίνακα με άρθρα και βίντεο με δυνατότητα αναζήτησης.