まだ厨二病

RとPyhtonを使ったデータ分析・統計解析らへんの話題をしていくだけ

?【簡易版】RからGoogle Books APIを叩いてブクログに書籍登録する

読んだり買ったりした本の記録をEvernoteにとっているのだけど、きちんとしたサービスを使うか、という気になってブクログを選んだ。しばらく使ってみて思ったのだが、キーワードから本を探して「本棚」に登録するという過程をとるのが面倒。ちまちま入力しているとこれ、Rでできないだろうかという気になる。

探してみたら、まとめて登録 (ISBN)という機能があった。これを使えばISBNあるいはASINコードをフォームに送信することで複数の本が登録可能で便利。ただ、ISBNは本を見たり、インターネットで調べないとわからなかったりする。面倒だ。

なのでチャチャっと書籍の情報を検索してブクログに登録する仕組みが必要になった。なければ作る、ホクソエムの誓いである

? やったこと

表題の通りで

  1. 登録したい書籍のISBN情報をGoogle Books APIを使って調べる
  2. ブクログにログインしてISBNから本棚に登録する

GoogleAPIを使うときはGoogle Developers Consoleからキーなりなんなりをとってくるのがお作法っぽいけど、今回は簡易版なのでそういうのは必要としない。利用の際にはAPIの上限に達しないように注意が必要。

? 使用パッケージ

library(jsonlite)
library(purrr)
library(xml2)
library(rvest)
library(dplyr)

Google Books API から対象の書籍情報を取得する

# 本のタイトルの一部やキーワードを用意する
books <- c("R 言語")

# キーワードを元にGoogle Books APIで書籍情報を検索
#   https://www.googleapis.com/books/v1/volumes?q=R+言語 というURLを生成する
#   必要な変数のみ選択
#     title, subtitle, authors, publisher, publishedDate, industryIdentifiers
#   ISBNのある「書籍」に絞る
#   複数の著者がいる場合、リストからベクトルにする
#   データフレームに結果を保存するがindustryIdentifiers変数はあとで削除する
#     書籍の順番は検索結果と等しい https://www.google.co.jp/search?q=R+言語
df_res <- paste0("https://www.googleapis.com/books/v1/volumes?q=",
           strsplit(books, "[[:space:]]") %>% unlist() %>% paste(., collapse = "+")) %>% 
  jsonlite::fromJSON(flatten = FALSE) %$% 
  items$volumeInfo %>% 
  dplyr::select(title, subtitle, authors, publisher, publishedDate, industryIdentifiers) %>% 
  dplyr::filter(grepl("ISBN_10", industryIdentifiers)) %>% 
  dplyr::mutate(authors = authors %>% purrr::map_chr(~ unlist(.) %>% paste(., collapse = ", ")))

df_res %<>% dplyr::select(-industryIdentifiers) %>% 
  dplyr::bind_cols(df_res$industryIdentifiers %>% 
                     purrr::map_df(~ dplyr::filter(., type == "ISBN_10") %>% 
                                     dplyr::select(identifier)))

こんな感じのデータフレームができる。全Rユーザー待望の「R言語徹底解説」はいよいよ今月発売であるが、まだGoogle Booksに登録されていない模様。

R言語徹底解説

R言語徹底解説

df_res %>% knitr::kable(format = "markdown")
title subtitle authors publisher publishedDate identifier
はじめてのS-PLUS/R言語プログラミング 竹内俊彦 株式会社 オーム社 2005-11 4274066231
R言語逆引きハンドブック 2.14.1に対応! 石田基広 NA 2012-02-03 4863540930
フレッシュマンから大学院生までのデータ解析・R言語 NA 渡辺利夫 NA 2005-09 4888488789
R言語上級ハンドブック NA 荒引健, 石田基広, 高橋康介, 林真広, 二階堂愛 NA 2013 486354135X
Rによるデータサイエンス データ解析の基礎から最新手法まで 金明哲 森北出版 2007-10 4627096011
プログラミングR 基礎からグラフィックスまで NA 高橋知巳 株式会社 オーム社 2008-11 4274067432
R&JavaScriptによるデータ解析と視覚化テクニック NA Tom Barker 翔泳社 2013-11-20 4798136093
言語行為 言語哲学への一試論 サール,J.R.(ジョン・R) NA 1986 4326198753
オートマトン言語理論計算論 II NA J. ホップクロフト, R. モトワニ, J. ウルマン NA 2003-08 4781910270

登録したい書籍のISBNを求めるには次のようにする。いずれかの方法で良い。

df_res$identifier[1]
## [1] "4274066231"
df_res %>% dplyr::filter(grepl("石田基広", authors)) %>% {
  print(.)
  # ブクログに登録するため、ISBNのベクトルを保存しておく
  book_isbn <<- .$identifier
}
## Source: local data frame [2 x 6]
## 
##                     title      subtitle
##                     (chr)         (chr)
## 1 R言語逆引きハンドブック 2.14.1に対応!
## 2   R言語上級ハンドブック            NA
##                                        authors
##                                          (chr)
## 1                                     石田基広
## 2 荒引健, 石田基広, 高橋康介, 林真広, 二階堂愛
## Variables not shown: publisher (chr), publishedDate (chr), identifier
##   (chr)

ブクログに登録

続いてブクログに書籍を登録する。ログインする必要があるので{rvest}パッケージを使ってセッションを作るところから始める。

# ログインようのセッション
session <- rvest::html_session(url = "https://booklog.jp/login")

set_values()に与えるアカウント名とパスワードはそれぞれ変更。

# ログインのため、フォームに送信するアカウントパスワードを用意
set_value <- html_form(session)[[1]] %>% set_values(account = "<アカウント名>", password = "<パスワード>")
form_isbn <- submit_form(session, set_value) %>% jump_to("/input") %>% 
  html_form()

# フォームに値を渡す。この時、ISBNが改行されるようにする
form_isbn[[2]]$fields[1]$isbns$value <- paste(book_isbn, collapse = "\n")

submit_form(session, set_value) %>% 
  jump_to("/input") %>% 
  submit_form(., form_isbn[[2]])
# <session> http://booklog.jp/input
#   Status: 200
#   Type:   text/html; charset=UTF-8
#   Size:   34095

というわけで? 登録できた。

f:id:u_ribo:20160109130955p:plain

http://booklog.jp/users/uribo087

めでたい ?

? 所感

  • 【簡易版】としたけど、どこが簡易なのかよくわからない。APIキーを用意するのが【通常版】ということで...
  • paste()関数のcollapse引数を初めて使ったような...
  • {purrr}パッケージの便利さがわかってきた
  • APIの取得結果を関数にして、dplyr::arrange()とかしたらもうちょっと捗りそう
広告を非表示にする