First we have to construct the url for the New York Times api, along with our api key. The NYT uses REST for their api, so we’ll need to append our key after a ? in the url, along with any queries. For now, let’s just look up the history of bestsellers.
books.url <- "https://api.nytimes.com/svc/books/v3/lists/best-sellers/history.json"
api.key <- "&api-key=3f19ff573ab540558e270090b7e7f4ae"
rest <- "?"
query <- paste(books.url, rest, api.key, sep = "")
raw.resp <- fromJSON(query)
raw.resp$num_results
## [1] 31175
31,175 is a lot to work with. It would be nice to restrict things by particular list names, like say “Fiction Best Sellers”, but the books_api seems limited in its search to only “age-group”, “author”, “contributor”, “isbn”, “price”, “publisher”, and “title”. “age-group” also seems to be relatively new.
For now, let’s examine the bestsellers of George R.R. Martin.
author <- "author=george+r+r+martin"
query <- paste(books.url, rest, author, api.key, sep = "")
raw.resp <- fromJSON(query)
raw.resp$num_results
## [1] 12
12 is much more manageable. With our raw response from our query, let’s pare down the information. As we’re only interested in best sellers, let’s extract only the authors, titles, prices, publishers.
best.sellers <- raw.resp$results[, c(1, 4, 6, 8)]
head(best.sellers, 5)
## title author price publisher
## 1 A CLASH OF KINGS George R R Martin 0 Bantam
## 2 A DANCE WITH DRAGONS George R R Martin 0 Bantam
## 3 A FEAST FOR CROWS George R R Martin 0 Bantam
## 4 A GAME OF THRONES George R R Martin 0 Bantam
## 5 A GAME OF THRONES: FIVE-BOOK SET George R R Martin 0 Bantam
Almost there. We need some information from their place on the list, and what list that might be. This becomes very complicated, as the rank_history is a nested dataframe. If a book reached a list, it will have a dataframe of 1 row and 11 columns. If it reached n lists, then that book will have a nested dataframe of n rows and 11 columns. We know this because, if we look at the developer page, there are 11 variables under “ranks_history”.
rank.names <- c("isbn10", "isbn13", "rank", "list", "display", "pub.date",
"bestseller.date", "weeks", "last.week", "asterisk", "dagger", "title")
rank.df <- data.frame(matrix(ncol = 12, nrow = 0))
raw.rank <- raw.resp$results$ranks_history
We’ll need to make a separate dataframe for just the rank information. We do this with 12 columns instead of 11, because we want to know the title as well. The author is not important in this particular scenario as we know it’s George R. R. Martin, but author may be added as well to make the columns 13. We also need the raw results of rank_history.
for(i in 1:length(raw.rank)){
rank.row <- as.data.frame(raw.rank[i])
# If rank.row == 0, then there's no information
# We add an empty row to our new dataframe
if(length(rank.row) == 0){
empty.row <- data.frame(matrix(rep(NA, 12),
ncol = 12, nrow = 1))
colnames(empty.row) <- rank.names
empty.row$title <- best.sellers$title[i]
rank.df <- rbind(rank.df, empty.row)
} else {
rank.row[, 12] <- best.sellers$title[i]
colnames(rank.row) <- rank.names
rank.df <-rbind(rank.df, rank.row)
}
}
head(rank.df, 5)
## isbn10 isbn13 rank list
## 1 <NA> <NA> NA <NA>
## 2 <NA> <NA> NA <NA>
## 3 <NA> <NA> NA <NA>
## 4 0553897845 9780553897845 7 Combined Print and E-Book Fiction
## 5 0553897845 9780553897845 13 Combined Print and E-Book Fiction
## display pub.date bestseller.date weeks
## 1 <NA> <NA> <NA> NA
## 2 <NA> <NA> <NA> NA
## 3 <NA> <NA> <NA> NA
## 4 Combined Print & E-Book Fiction 2017-09-17 2017-09-02 51
## 5 Combined Print & E-Book Fiction 2017-09-10 2017-08-26 50
## last.week asterisk dagger title
## 1 NA NA NA A CLASH OF KINGS
## 2 NA NA NA A DANCE WITH DRAGONS
## 3 NA NA NA A FEAST FOR CROWS
## 4 NA 0 0 A GAME OF THRONES
## 5 NA 0 0 A GAME OF THRONES
final.df <- merge(best.sellers, rank.df)
kable(final.df)
| title | author | price | publisher | isbn10 | isbn13 | rank | list | display | pub.date | bestseller.date | weeks | last.week | asterisk | dagger |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| A CLASH OF KINGS | George R R Martin | 0 | Bantam | NA | NA | NA | NA | NA | NA | NA | NA | NA | NA | NA |
| A DANCE WITH DRAGONS | George R R Martin | 0 | Bantam | NA | NA | NA | NA | NA | NA | NA | NA | NA | NA | NA |
| A FEAST FOR CROWS | George R R Martin | 0 | Bantam | NA | NA | NA | NA | NA | NA | NA | NA | NA | NA | NA |
| A GAME OF THRONES | George R R Martin | 0 | Bantam | 0553897845 | 9780553897845 | 7 | Combined Print and E-Book Fiction | Combined Print & E-Book Fiction | 2017-09-17 | 2017-09-02 | 51 | NA | 0 | 0 |
| A GAME OF THRONES | George R R Martin | 0 | Bantam | 0553897845 | 9780553897845 | 13 | Combined Print and E-Book Fiction | Combined Print & E-Book Fiction | 2017-09-10 | 2017-08-26 | 50 | NA | 0 | 0 |
| A GAME OF THRONES | George R R Martin | 0 | Bantam | 0553897845 | 9780553897845 | 14 | Combined Print and E-Book Fiction | Combined Print & E-Book Fiction | 2017-09-03 | 2017-08-19 | 49 | NA | 0 | 0 |
| A GAME OF THRONES | George R R Martin | 0 | Bantam | 0553897845 | 9780553897845 | 7 | Combined Print and E-Book Fiction | Combined Print & E-Book Fiction | 2017-08-06 | 2017-07-22 | 48 | NA | 0 | 0 |
| A GAME OF THRONES | George R R Martin | 0 | Bantam | None | 9780399180842 | 8 | Combined Print and E-Book Fiction | Combined Print & E-Book Fiction | 2017-07-30 | 2017-07-15 | 47 | NA | 0 | 0 |
| A GAME OF THRONES | George R R Martin | 0 | Bantam | 0553897845 | 9780553897845 | 11 | E-Book Fiction | E-Book Fiction | 2016-12-18 | 2016-12-03 | 0 | NA | 0 | 0 |
| A GAME OF THRONES | George R R Martin | 0 | Bantam | 0553573403 | 9780553573404 | 10 | Mass Market Paperback | Paperback Mass-Market Fiction | 2016-08-07 | 2016-07-23 | 199 | NA | 0 | 0 |
| A GAME OF THRONES | George R R Martin | 0 | Bantam | 0553573403 | 9780553573404 | 10 | Mass Market Paperback | Paperback Mass-Market Fiction | 2016-07-31 | 2016-07-16 | 198 | NA | 0 | 0 |
| A GAME OF THRONES | George R R Martin | 0 | Bantam | 0553573403 | 9780553573404 | 11 | Mass Market Paperback | Paperback Mass-Market Fiction | 2016-07-24 | 2016-07-09 | 0 | NA | 0 | 0 |
| A GAME OF THRONES | George R R Martin | 0 | Bantam | 0553897845 | 9780553897845 | 19 | Combined Print and E-Book Fiction | Combined Print & E-Book Fiction | 2016-07-24 | 2016-07-09 | 0 | NA | 0 | 0 |
| A GAME OF THRONES | George R R Martin | 0 | Bantam | 0553573403 | 9780553573404 | 8 | Mass Market Paperback | Paperback Mass-Market Fiction | 2016-07-17 | 2016-07-02 | 197 | NA | 0 | 0 |
| A GAME OF THRONES | George R R Martin | 0 | Bantam | 0553897845 | 9780553897845 | 12 | E-Book Fiction | E-Book Fiction | 2016-07-17 | 2016-07-02 | 0 | NA | 0 | 0 |
| A GAME OF THRONES | George R R Martin | 0 | Bantam | 0553897845 | 9780553897845 | 11 | Combined Print and E-Book Fiction | Combined Print & E-Book Fiction | 2016-07-17 | 2016-07-02 | 46 | NA | 0 | 0 |
| A GAME OF THRONES | George R R Martin | 0 | Bantam | 0553573403 | 9780553573404 | 8 | Mass Market Paperback | Paperback Mass-Market Fiction | 2016-06-12 | 2016-05-28 | 196 | NA | 0 | 0 |
| A GAME OF THRONES | George R R Martin | 0 | Bantam | 0553573403 | 9780553573404 | 8 | Mass Market Paperback | Paperback Mass-Market Fiction | 2016-06-05 | 2016-05-21 | 195 | NA | 0 | 0 |
| A GAME OF THRONES | George R R Martin | 0 | Bantam | 0553573403 | 9780553573404 | 9 | Mass Market Paperback | Paperback Mass-Market Fiction | 2016-05-29 | 2016-05-14 | 194 | NA | 0 | 0 |
| A GAME OF THRONES | George R R Martin | 0 | Bantam | 0553573403 | 9780553573404 | 14 | Mass Market Paperback | Paperback Mass-Market Fiction | 2016-05-22 | 2016-05-07 | 0 | NA | 0 | 0 |
| A GAME OF THRONES: FIVE-BOOK SET | George R R Martin | 0 | Bantam | NA | NA | NA | NA | NA | NA | NA | NA | NA | NA | NA |
| A KNIGHT OF THE SEVEN KINGDOMS | George R R Martin | 0 | Bantam | 0345533488 | 9780345533487 | 14 | Hardcover Fiction | Hardcover Fiction | 2016-01-24 | 2016-01-09 | 10 | NA | 0 | 0 |
| A KNIGHT OF THE SEVEN KINGDOMS | George R R Martin | 0 | Bantam | 0345533488 | 9780345533487 | 16 | Hardcover Fiction | Hardcover Fiction | 2016-01-17 | 2016-01-02 | 9 | NA | 1 | 0 |
| A KNIGHT OF THE SEVEN KINGDOMS | George R R Martin | 0 | Bantam | 0345533488 | 9780345533487 | 15 | Hardcover Fiction | Hardcover Fiction | 2016-01-10 | 2015-12-26 | 8 | NA | 1 | 0 |
| A SONG OF ICE AND FIRE | George R R Martin | 0 | Random House Publishing | NA | NA | NA | NA | NA | NA | NA | NA | NA | NA | NA |
| A STORM OF SWORDS | George R R Martin | 0 | Bantam | NA | NA | NA | NA | NA | NA | NA | NA | NA | NA | NA |
| DANGEROUS WOMEN | edited George R R Martin and Gardner Dozois | 0 | Tor/Tom Doherty | NA | NA | NA | NA | NA | NA | NA | NA | NA | NA | NA |
| ROGUES | edited George R R Martin and Gardner Dozois | 0 | Bantam | NA | NA | NA | NA | NA | NA | NA | NA | NA | NA | NA |
| THE ICE DRAGON | George R R Martin | 0 | Tom Doherty Associates | NA | NA | NA | NA | NA | NA | NA | NA | NA | NA | NA |
| THE WORLD OF ICE AND FIRE | George R R Martin, Elio M García Jr and Linda Antonsson | 0 | Bantam | NA | NA | NA | NA | NA | NA | NA | NA | NA | NA | NA |
And there we have a full dataframe of George R. R. Martin’s New York Times Bestsellers.