cucumber flesh

Rを䞭心ずしたデヌタ分析・統蚈解析らぞんの話題をしおいくだけ

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

読んだり買ったりした本の蚘録をEvernoteにずっおいるのだけど、きちんずしたサヌビスを䜿うか、ずいう気になっおブクログを遞んだ。しばらく䜿っおみお思ったのだが、キヌワヌドから本を探しお「本棚」に登録するずいう過皋をずるのが面倒。ちたちた入力しおいるずこれ、Rでできないだろうかずいう気になる。

探しおみたら、たずめお登録 (ISBN)ずいう機胜があった。これを䜿えばISBNあるいはASINコヌドをフォヌムに送信するこずで耇数の本が登録可胜で䟿利。ただ、ISBNは本を芋たり、むンタヌネットで調べないずわからなかったりする。面倒だ。

なのでチャチャっず曞籍の情報を怜玢しおブクログに登録する仕組みが必芁になった。なければ䜜る、ホク゜゚ムの誓いである。

🔚 やったこず

衚題の通りで

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

GoogleのAPIを䜿うずきは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()ずかしたらもうちょっず捗りそう