Web APIs

This assignment is to choose one of the NY Time APIs, construct an interface in R to read in the JSON data, then transform data to an R dataframe.

Query NYT via API

The NY Times Newswire API provides an up-to-the-minute stream of published articles. Usage requires obtaining an authorized API access key after completing registration form.

The registered API key is stored in a .csv file and loaded at script run time.

An HTTP API query for articles was requested.

# query NYT for all articles

theURL <- "D607_A09_API.csv"
nyt_API_key <- read.csv(file=theURL, header=TRUE, sep=",")

nyt_URL_all <- c("https://api.nytimes.com/svc/news/v3/content/all/all.json?api-key=")
nyt_URL_wAPIkey <- str_c(nyt_URL_all,nyt_API_key)

nyt_r <- GET(nyt_URL_wAPIkey)

# check response code
http_status(nyt_r)
## $category
## [1] "Success"
## 
## $reason
## [1] "OK"
## 
## $message
## [1] "Success: (200) OK"
stop_for_status(nyt_r)

Transform JSON to R dataframe

After a successful API query, “raw” JSON data is transformed into an R data frame with containing 20 observations comprised of 26 variables.

# Transform JSON data to R data frame
nyt_query <- httr::content(nyt_r, as="raw")
nyt_json <- jsonlite::fromJSON(rawToChar(nyt_query))
nyt_df <- flatten(as.data.frame(nyt_json))

Explorary Data Analysis

The data frame is subsetted containing section name, article title, byline, and creation date, arranged in section and title order, then reported.

# Tidy data
(dim(nyt_df))
## [1] 20 26
(names(nyt_df))
##  [1] "status"                       "copyright"                   
##  [3] "num_results"                  "results.slug_name"           
##  [5] "results.section"              "results.subsection"          
##  [7] "results.title"                "results.abstract"            
##  [9] "results.url"                  "results.byline"              
## [11] "results.thumbnail_standard"   "results.item_type"           
## [13] "results.source"               "results.updated_date"        
## [15] "results.created_date"         "results.published_date"      
## [17] "results.first_published_date" "results.material_type_facet" 
## [19] "results.kicker"               "results.subheadline"         
## [21] "results.des_facet"            "results.org_facet"           
## [23] "results.per_facet"            "results.geo_facet"           
## [25] "results.related_urls"         "results.multimedia"
nyt_subset_df <- nyt_df %>% 
    select(results.section, results.title, results.byline,results.created_date) %>% 
  arrange(results.section, results.title)

tibble(nyt_subset_df)
## # A tibble: 20 x 4
##    results.section results.title            results.byline     results.created_~
##    <chr>           <chr>                    <chr>              <chr>            
##  1 Arts            Jerry Jeff Walker, Who ~ "BY BILL FRISKICS~ 2020-10-24T16:39~
##  2 Briefing        pmvote                   ""                 2020-10-24T16:44~
##  3 Opinion         A Photographer’s Amer~ "BY AN-MY LÊ"     2020-10-24T17:04~
##  4 Sports          At heavyweight, bigger ~ "BY MORGAN CAMPBE~ 2020-10-24T15:47~
##  5 Sports          Early Virus Scares Kept~ "BY TYLER KEPNER"  2020-10-24T17:59~
##  6 Sports          Nurmagomedov announced ~ "BY MORGAN CAMPBE~ 2020-10-24T17:18~
##  7 Sports          Nurmagomedov beat Gaeth~ "BY MORGAN CAMPBE~ 2020-10-24T16:55~
##  8 Sports          Round 1: Nurmagomedov p~ "BY MORGAN CAMPBE~ 2020-10-24T16:50~
##  9 Sports          Volkov dropped Harris w~ "BY MORGAN CAMPBE~ 2020-10-24T15:54~
## 10 Sports          Whittaker took a unanim~ "BY MORGAN CAMPBE~ 2020-10-24T16:31~
## 11 Theater         Edith O’Hara, a Fixtu~ "BY NEIL GENZLING~ 2020-10-24T16:48~
## 12 U.S.            ‘Florida Man wouldnâ€~ "BY GLENN THRUSH ~ 2020-10-24T17:52~
## 13 U.S.            Enthusiastic voters are~ "BY MICHAEL LEVEN~ 2020-10-24T16:12~
## 14 U.S.            Iowa: This presidential~ "BY LUKE BROADWAT~ 2020-10-24T17:00~
## 15 U.S.            Murkowski, in a turnabo~ "BY NICHOLAS FAND~ 2020-10-24T16:00~
## 16 U.S.            One of the Parkland sho~ "BY EVAN NICOLE B~ 2020-10-24T17:14~
## 17 U.S.            Virus Surge Shadows Tru~ "BY SHANE GOLDMAC~ 2020-10-24T15:31~
## 18 World           Poland’s president te~ "BY MONIKA PRONCZ~ 2020-10-24T16:04~
## 19 World           The Czech Republic’s ~ "BY HANA DE GOEIJ" 2020-10-24T15:56~
## 20 World           Venezuela Opposition Fi~ "BY ANATOLY KURMA~ 2020-10-24T17:12~

Query Section Names

Query the list of NY Times Section names. This list can be used in future section specific queries.

# Query NYT section names then tidy

nyt_URL_section <- c("https://api.nytimes.com/svc/news/v3/content/section-list.json?api-key=")
nyt_URL_wAPIkey <- str_c(nyt_URL_section,nyt_API_key)

nyt_r <- GET(nyt_URL_wAPIkey)

# check response code
http_status(nyt_r)
## $category
## [1] "Success"
## 
## $reason
## [1] "OK"
## 
## $message
## [1] "Success: (200) OK"
# transform data
nyt_query <- httr::content(nyt_r, as="raw")
nyt_json <- jsonlite::fromJSON(rawToChar(nyt_query))
nyt_sec_df <- flatten(as.data.frame(nyt_json))


nyt_subset_df <- nyt_sec_df %>% 
  select(results.section,results.display_name) %>% 
  arrange(results.section)

tibble(nyt_subset_df)
## # A tibble: 50 x 2
##    results.section    results.display_name
##    <chr>              <chr>               
##  1 admin              Admin               
##  2 arts               Arts                
##  3 automobiles        Automobiles         
##  4 books              Books               
##  5 briefing           Briefing            
##  6 business           Business            
##  7 climate            Climate             
##  8 corrections        Corrections         
##  9 crosswords & games Crosswords & Games  
## 10 education          Education           
## # ... with 40 more rows

Summary

In this assignment, the following tasks were performed:
- completion of an online registration form necessary to obtain an authorized NY Times API key for query access,
- the API key was stored in a .csv file and read at script run time,
- an HTTP API query for the NY Times Newswire limited to 20 results (default),
- these results were received in JSON data format then transformed into a dataframe,
- several columns were selected and arranged by article section and title for reporting, and
- an additional query of all sections were obtained and arranged by section for reporting.

In conclusion, this working API script can be used to create specific queries. For example, searching all articles with titles and abstracts containing COVID and/or flu that can be extracted for further data analysis and text mining.

LS0tDQp0aXRsZTogIkQ2MDdfQTA5X1JpY2tSTiINCmF1dGhvcjogIlJpY2tSTiINCmRhdGU6ICJgciBTeXMuRGF0ZSgpYCINCm91dHB1dDogDQogIG9wZW5pbnRybzo6bGFiX3JlcG9ydDogZGVmYXVsdA0KICBodG1sX2RvY3VtZW50Og0KICAgIG51bWJlcl9zZWN0aW9uczogeWVzDQotLS0NCg0KYGBge3Igc3RlcF9zZXR1cCwgaW5jbHVkZT1GQUxTRX0NCmtuaXRyOjpvcHRzX2NodW5rJHNldChlY2hvID0gVFJVRSkNCmxpYnJhcnkodGlkeXZlcnNlKQ0KbGlicmFyeShydmVzdCkNCmxpYnJhcnkoWE1MKQ0KbGlicmFyeShSQ3VybCkNCmxpYnJhcnkocmpzb24pDQpsaWJyYXJ5KGpzb25saXRlKQ0KDQpsaWJyYXJ5KGh0dHIpDQpgYGANCg0KIyBXZWIgQVBJcw0KDQo8c3R5bGU+DQpkaXYuYmx1ZSB7IGJhY2tncm91bmQtY29sb3I6I2U2ZjBmZjsgYm9yZGVyLXJhZGl1czogNXB4OyBwYWRkaW5nOiAyMHB4O30NCjwvc3R5bGU+DQo8ZGl2IGNsYXNzID0gImJsdWUiPg0KDQpUaGlzIGFzc2lnbm1lbnQgaXMgdG8gY2hvb3NlIG9uZSBvZiB0aGUgTlkgVGltZSBBUElzLA0KY29uc3RydWN0IGFuIGludGVyZmFjZSBpbiBSIHRvIHJlYWQgaW4gdGhlIEpTT04gZGF0YSwgdGhlbg0KdHJhbnNmb3JtIGRhdGEgdG8gYW4gUiBkYXRhZnJhbWUuDQoNCjwvZGl2PiBcaGZpbGxcYnJlYWsNCg0KDQoNCiMgUXVlcnkgTllUIHZpYSBBUEkNCg0KPHN0eWxlPg0KZGl2LmJsdWUgeyBiYWNrZ3JvdW5kLWNvbG9yOiNlNmYwZmY7IGJvcmRlci1yYWRpdXM6IDVweDsgcGFkZGluZzogMjBweDt9DQo8L3N0eWxlPg0KPGRpdiBjbGFzcyA9ICJibHVlIj4NCg0KVGhlICpbTlkgVGltZXMgTmV3c3dpcmUgQVBJXShodHRwczovL2RldmVsb3Blci5ueXRpbWVzLmNvbS9kb2NzL3RpbWVzd2lyZS1wcm9kdWN0LzEvb3ZlcnZpZXcpKg0KcHJvdmlkZXMgYW4gdXAtdG8tdGhlLW1pbnV0ZSBzdHJlYW0gb2YgcHVibGlzaGVkIGFydGljbGVzLiBVc2FnZSByZXF1aXJlcyBvYnRhaW5pbmcgYW4gYXV0aG9yaXplZCBBUEkgYWNjZXNzIGtleSBhZnRlciBjb21wbGV0aW5nIHJlZ2lzdHJhdGlvbiBmb3JtLg0KDQpUaGUgcmVnaXN0ZXJlZCBBUEkga2V5IGlzIHN0b3JlZCBpbiBhIC5jc3YgZmlsZSBhbmQgbG9hZGVkIGF0IHNjcmlwdCBydW4gdGltZS4NCg0KQW4gSFRUUCBBUEkgcXVlcnkgZm9yIGFydGljbGVzIHdhcyByZXF1ZXN0ZWQuDQoNCg0KDQoNCjwvZGl2PiBcaGZpbGxcYnJlYWsNCg0KDQpgYGB7ciBzdGVwX2dldEFQSWRhdGEsIGVjaG89VFJVRSB9DQojIHF1ZXJ5IE5ZVCBmb3IgYWxsIGFydGljbGVzDQoNCnRoZVVSTCA8LSAiRDYwN19BMDlfQVBJLmNzdiINCm55dF9BUElfa2V5IDwtIHJlYWQuY3N2KGZpbGU9dGhlVVJMLCBoZWFkZXI9VFJVRSwgc2VwPSIsIikNCg0Kbnl0X1VSTF9hbGwgPC0gYygiaHR0cHM6Ly9hcGkubnl0aW1lcy5jb20vc3ZjL25ld3MvdjMvY29udGVudC9hbGwvYWxsLmpzb24/YXBpLWtleT0iKQ0Kbnl0X1VSTF93QVBJa2V5IDwtIHN0cl9jKG55dF9VUkxfYWxsLG55dF9BUElfa2V5KQ0KDQpueXRfciA8LSBHRVQobnl0X1VSTF93QVBJa2V5KQ0KDQojIGNoZWNrIHJlc3BvbnNlIGNvZGUNCmh0dHBfc3RhdHVzKG55dF9yKQ0Kc3RvcF9mb3Jfc3RhdHVzKG55dF9yKQ0KDQpgYGANCg0KIyBUcmFuc2Zvcm0gSlNPTiB0byBSIGRhdGFmcmFtZQ0KDQo8c3R5bGU+DQpkaXYuYmx1ZSB7IGJhY2tncm91bmQtY29sb3I6I2U2ZjBmZjsgYm9yZGVyLXJhZGl1czogNXB4OyBwYWRkaW5nOiAyMHB4O30NCjwvc3R5bGU+DQo8ZGl2IGNsYXNzID0gImJsdWUiPg0KDQpBZnRlciBhIHN1Y2Nlc3NmdWwgQVBJIHF1ZXJ5LCAicmF3IiBKU09OIGRhdGEgaXMgdHJhbnNmb3JtZWQgaW50byBhbiBSIGRhdGEgZnJhbWUgd2l0aCBjb250YWluaW5nIDIwIG9ic2VydmF0aW9ucyBjb21wcmlzZWQgb2YgMjYgdmFyaWFibGVzLg0KDQoNCjwvZGl2PiBcaGZpbGxcYnJlYWsNCmBgYHtyIHN0ZXBfeSwgZWNobz1UUlVFfQ0KIyBUcmFuc2Zvcm0gSlNPTiBkYXRhIHRvIFIgZGF0YSBmcmFtZQ0Kbnl0X3F1ZXJ5IDwtIGh0dHI6OmNvbnRlbnQobnl0X3IsIGFzPSJyYXciKQ0Kbnl0X2pzb24gPC0ganNvbmxpdGU6OmZyb21KU09OKHJhd1RvQ2hhcihueXRfcXVlcnkpKQ0Kbnl0X2RmIDwtIGZsYXR0ZW4oYXMuZGF0YS5mcmFtZShueXRfanNvbikpDQpgYGANCg0KIyBFeHBsb3JhcnkgRGF0YSBBbmFseXNpcw0KDQo8c3R5bGU+DQpkaXYuYmx1ZSB7IGJhY2tncm91bmQtY29sb3I6I2U2ZjBmZjsgYm9yZGVyLXJhZGl1czogNXB4OyBwYWRkaW5nOiAyMHB4O30NCjwvc3R5bGU+DQo8ZGl2IGNsYXNzID0gImJsdWUiPg0KDQpUaGUgZGF0YSBmcmFtZSBpcyBzdWJzZXR0ZWQgY29udGFpbmluZyBzZWN0aW9uIG5hbWUsIGFydGljbGUgdGl0bGUsIGJ5bGluZSwgYW5kIGNyZWF0aW9uIGRhdGUsIGFycmFuZ2VkIGluIHNlY3Rpb24gYW5kIHRpdGxlIG9yZGVyLCB0aGVuIHJlcG9ydGVkLiANCg0KPC9kaXY+IFxoZmlsbFxicmVhaw0KDQpgYGB7ciBzdGVwX3osIGVjaG89VFJVRX0NCiMgVGlkeSBkYXRhDQooZGltKG55dF9kZikpDQoobmFtZXMobnl0X2RmKSkNCg0Kbnl0X3N1YnNldF9kZiA8LSBueXRfZGYgJT4lIA0KICAgIHNlbGVjdChyZXN1bHRzLnNlY3Rpb24sIHJlc3VsdHMudGl0bGUsIHJlc3VsdHMuYnlsaW5lLHJlc3VsdHMuY3JlYXRlZF9kYXRlKSAlPiUgDQogIGFycmFuZ2UocmVzdWx0cy5zZWN0aW9uLCByZXN1bHRzLnRpdGxlKQ0KDQp0aWJibGUobnl0X3N1YnNldF9kZikNCmBgYA0KDQoNCiMgUXVlcnkgU2VjdGlvbiBOYW1lcw0KDQo8c3R5bGU+DQpkaXYuYmx1ZSB7IGJhY2tncm91bmQtY29sb3I6I2U2ZjBmZjsgYm9yZGVyLXJhZGl1czogNXB4OyBwYWRkaW5nOiAyMHB4O30NCjwvc3R5bGU+DQo8ZGl2IGNsYXNzID0gImJsdWUiPg0KDQpRdWVyeSB0aGUgbGlzdCBvZiBOWSBUaW1lcyBTZWN0aW9uIG5hbWVzLiAgVGhpcyBsaXN0IGNhbiBiZSB1c2VkIGluIGZ1dHVyZSBzZWN0aW9uIHNwZWNpZmljIHF1ZXJpZXMuIA0KDQo8L2Rpdj4gXGhmaWxsXGJyZWFrDQoNCmBgYHtyIHN0ZXBfejEsIGVjaG89VFJVRX0NCiMgUXVlcnkgTllUIHNlY3Rpb24gbmFtZXMgdGhlbiB0aWR5DQoNCm55dF9VUkxfc2VjdGlvbiA8LSBjKCJodHRwczovL2FwaS5ueXRpbWVzLmNvbS9zdmMvbmV3cy92My9jb250ZW50L3NlY3Rpb24tbGlzdC5qc29uP2FwaS1rZXk9IikNCm55dF9VUkxfd0FQSWtleSA8LSBzdHJfYyhueXRfVVJMX3NlY3Rpb24sbnl0X0FQSV9rZXkpDQoNCm55dF9yIDwtIEdFVChueXRfVVJMX3dBUElrZXkpDQoNCiMgY2hlY2sgcmVzcG9uc2UgY29kZQ0KaHR0cF9zdGF0dXMobnl0X3IpDQoNCiMgdHJhbnNmb3JtIGRhdGENCm55dF9xdWVyeSA8LSBodHRyOjpjb250ZW50KG55dF9yLCBhcz0icmF3IikNCm55dF9qc29uIDwtIGpzb25saXRlOjpmcm9tSlNPTihyYXdUb0NoYXIobnl0X3F1ZXJ5KSkNCm55dF9zZWNfZGYgPC0gZmxhdHRlbihhcy5kYXRhLmZyYW1lKG55dF9qc29uKSkNCg0KDQpueXRfc3Vic2V0X2RmIDwtIG55dF9zZWNfZGYgJT4lIA0KICBzZWxlY3QocmVzdWx0cy5zZWN0aW9uLHJlc3VsdHMuZGlzcGxheV9uYW1lKSAlPiUgDQogIGFycmFuZ2UocmVzdWx0cy5zZWN0aW9uKQ0KDQp0aWJibGUobnl0X3N1YnNldF9kZikNCmBgYA0KDQojIFN1bW1hcnkNCg0KPHN0eWxlPg0KZGl2LmJsdWUgeyBiYWNrZ3JvdW5kLWNvbG9yOiNlNmYwZmY7IGJvcmRlci1yYWRpdXM6IDVweDsgcGFkZGluZzogMjBweDt9DQo8L3N0eWxlPg0KPGRpdiBjbGFzcyA9ICJibHVlIj4NCg0KSW4gdGhpcyBhc3NpZ25tZW50LCB0aGUgZm9sbG93aW5nIHRhc2tzIHdlcmUgcGVyZm9ybWVkOiAgDQotIGNvbXBsZXRpb24gb2YgYW4gb25saW5lIHJlZ2lzdHJhdGlvbiBmb3JtIG5lY2Vzc2FyeSB0byBvYnRhaW4gYW4gYXV0aG9yaXplZCBOWSBUaW1lcyBBUEkga2V5IGZvciBxdWVyeSBhY2Nlc3MsICANCi0gdGhlIEFQSSBrZXkgd2FzIHN0b3JlZCBpbiBhIC5jc3YgZmlsZSBhbmQgcmVhZCBhdCBzY3JpcHQgcnVuIHRpbWUsICANCi0gYW4gSFRUUCBBUEkgcXVlcnkgZm9yIHRoZSBOWSBUaW1lcyBOZXdzd2lyZSBsaW1pdGVkIHRvIDIwIHJlc3VsdHMgKGRlZmF1bHQpLCAgDQotIHRoZXNlIHJlc3VsdHMgd2VyZSByZWNlaXZlZCBpbiBKU09OIGRhdGEgZm9ybWF0IHRoZW4gdHJhbnNmb3JtZWQgaW50byBhIGRhdGFmcmFtZSwgIA0KLSBzZXZlcmFsIGNvbHVtbnMgd2VyZSBzZWxlY3RlZCBhbmQgYXJyYW5nZWQgYnkgYXJ0aWNsZSBzZWN0aW9uIGFuZCB0aXRsZSBmb3IgcmVwb3J0aW5nLCBhbmQgICAgDQotIGFuIGFkZGl0aW9uYWwgcXVlcnkgb2YgYWxsIHNlY3Rpb25zIHdlcmUgb2J0YWluZWQgYW5kIGFycmFuZ2VkIGJ5IHNlY3Rpb24gZm9yIHJlcG9ydGluZy4NCg0KSW4gY29uY2x1c2lvbiwgdGhpcyB3b3JraW5nIEFQSSBzY3JpcHQgY2FuIGJlIHVzZWQgdG8gY3JlYXRlIHNwZWNpZmljIHF1ZXJpZXMuICBGb3IgZXhhbXBsZSwgc2VhcmNoaW5nIGFsbCBhcnRpY2xlcyB3aXRoIHRpdGxlcyBhbmQgYWJzdHJhY3RzIGNvbnRhaW5pbmcgQ09WSUQgYW5kL29yIGZsdSB0aGF0IGNhbiBiZSBleHRyYWN0ZWQgZm9yIGZ1cnRoZXIgZGF0YSBhbmFseXNpcyBhbmQgdGV4dCBtaW5pbmcuDQoNCjwvZGl2PiBcaGZpbGxcYnJlYWsNCg==