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.