CiNii(国立情報学研究所の論文DB)にAPIでアクセスする
(その2)


作新学院大学 藤本一男 kazuo.fujimoto2007@gmail.com

2018/11/10 Tokyo.R#74LT

前回(Tokyo.R#73LT)のおはなし

  • https://bit.ly/2AjEEXT (#73LTのスライド)
  • Package httr を使ってQuery文字列をサーバーになげてレザルトをGET
  • そのresultの構造をstr()で調べて、contentの中身が本体であることがわかったので、 一度、テキストファイルに書き出して、再度read_lines()をしてRオブジェクトに(<- これ情けない…)。
  • hit件数は、タグ に挟まれていたので、その行を見つけて数値をとりだした(parse_number())。

こんな感じで力ずくでhit数を取り出していたのが、前回。

今回は、もう少しスマートにやります。(あと、reveal.js 使ってみました。)

library

library(rvest) # これが本丸
library(tidyverse)
library(patchwork)# #73の応用セッションで教えてもらった

functions

二つ作りました。

  • Query文字列を生成するもの
  • 取得したhit数をグラフ化するもの。前回の応用セッションで教えてもらった技を使ってみました。patchwork

トークン生成

  • URL、検索文字列(query_w)、利用者ID(appID)、集計開始年次、終了年次、をつなげてト^クン文字列に形成します。
  • 一度に取得できるresult数の最大が200なので、同一年にそれ以上hitする場合はどうしていいのか不明。
make_token <- function(URL,query_w,appID,start_y,end_y){
  token <- paste0(URL,"?","q=",query_w,"&appID=",appID,
                  "&format=rss","&count=200",
                  "&year_from=",start_y,"&year_to=",end_y)
  return(token)
}

取得結果をggplotでグラフ表示

plot_hit2 <- function(query_w,hit_year){
  tbl_df(hit_year) %>% rename(Year=year,Count=hits) %>%
    mutate(Cumsum=cumsum(Count)) -> .gd0 
  
  p <- ggplot(.gd0) + geom_point(aes(x= Year,y= Count),colour="blue") +
    geom_segment(aes(x=Year,y=Count,xend=Year,yend=0),colour="grey")
  p1 <- p + ggtitle(paste0("CiNiiで検索(hit数):",query_w)) +
    theme_grey(base_family = "sans")
  
  p <- ggplot(.gd0) + geom_line(aes(x=Year,y=Cumsum)) + 
           geom_point(aes(x=Year,y=Cumsum))
  p2 <- p + ggtitle(paste0("CiNiiで検索(累積):",query_w)) +
    theme_grey(base_family = "sans")
  
  print(p2 + p1 + plot_layout(ncol = 1, heights = c(3, 1)))
}

Token の形成,resultの取得

基本設定

appID = "XXXXXXXXXXXXXXXXXXX"
URL = "http://ci.nii.ac.jp/opensearch/search"

検索語の設定

query_w = "対応分析"  #URLencode は不要
start <- 1980
end <- 2018

年次をLoopさせてhit数を取得

year_nn <- data.frame()
for(i in start:end){
  res.xml <- read_xml(make_token(URL,query_w,appID,i,i))
  xml_children(res.xml)[[1]] %>% as_list() -> res.header
  res.header$totalResults[[1]] %>% as.numeric() -> nn
  year_nn <- rbind(year_nn,c(i,nn))
}
colnames(year_nn) <- c("year","hits")
year_nn %>% mutate(hitcum=cumsum(hits)) %>% tail()
##    year hits hitcum
## 34 2013   26    261
## 35 2014   28    289
## 36 2015   27    316
## 37 2016   19    335
## 38 2017   19    354
## 39 2018   16    370

result の展開 1

xml_children(res.xml)
## {xml_nodeset (20)}
##  [1] <channel rdf:about="https://ci.nii.ac.jp/opensearch/search?q=%e5%af ...
##  [2] <item rdf:about="https://ci.nii.ac.jp/naid/40021429732">\n  <title> ...
##  [3] <item rdf:about="https://ci.nii.ac.jp/naid/40021185987">\n  <title> ...
##  [4] <item rdf:about="https://ci.nii.ac.jp/naid/120006243116">\n  <title ...
##  [5] <item rdf:about="https://ci.nii.ac.jp/naid/120006000156">\n  <title ...
##  [6] <item rdf:about="https://ci.nii.ac.jp/naid/40021559870">\n  <title> ...
##  [7] <item rdf:about="https://ci.nii.ac.jp/naid/40021330481">\n  <title> ...
##  [8] <item rdf:about="https://ci.nii.ac.jp/naid/40021195144">\n  <title> ...
##  [9] <item rdf:about="https://ci.nii.ac.jp/naid/130007474484">\n  <title ...
## [10] <item rdf:about="https://ci.nii.ac.jp/naid/130007422541">\n  <title ...
## [11] <item rdf:about="https://ci.nii.ac.jp/naid/130006776985">\n  <title ...
## [12] <item rdf:about="https://ci.nii.ac.jp/naid/130006302454">\n  <title ...
## [13] <item rdf:about="https://ci.nii.ac.jp/naid/130006192952">\n  <title ...
## [14] <item rdf:about="https://ci.nii.ac.jp/naid/130006179573">\n  <title ...
## [15] <item rdf:about="https://ci.nii.ac.jp/naid/130006086145">\n  <title ...
## [16] <item rdf:about="https://ci.nii.ac.jp/naid/130006077627">\n  <title ...
## [17] <item rdf:about="https://ci.nii.ac.jp/naid/130005864949">\n  <title ...
## [18] <item rdf:about="https://ci.nii.ac.jp/naid/130005466783">\n  <title ...
## [19] <item rdf:about="https://ci.nii.ac.jp/naid/120006502028">\n  <title ...
## [20] <item rdf:about="https://ci.nii.ac.jp/naid/120006342410">\n  <title ...

result の展開 2

xml_children(res.xml)[[1]]
## {xml_node}
## <channel about="https://ci.nii.ac.jp/opensearch/search?q=%e5%af%be%e5%bf%9c%e5%88%86%e6%9e%90&appID=j38sofo6PQBkh3Zl2Gt5&format=rss&count=200&year_from=2017&year_to=2017&REMOTE_ADDR2=126.235.212.127">
## [1] <title>CiNii OpenSearch - 対応分析 2017 2017</title>
## [2] <description>CiNii OpenSearch - 対応分析 2017 2017</description>
## [3] <link>https://ci.nii.ac.jp/opensearch/search?q=%e5%af%be%e5%bf%9c%e5 ...
## [4] <dc:date>2018-11-09T22:05:43+09:00</dc:date>
## [5] <opensearch:totalResults>19</opensearch:totalResults>
## [6] <opensearch:startIndex>1</opensearch:startIndex>
## [7] <opensearch:itemsPerPage>19</opensearch:itemsPerPage>
## [8] <items>\n  <rdf:Seq>\n    <rdf:li rdf:resource="https://ci.nii.ac.jp ...

result の展開 3

xml_children(res.xml)[[1]] %>% as_list()
## $title
## $title[[1]]
## [1] "CiNii OpenSearch - 対応分析 2017 2017"
## 
## 
## $description
## $description[[1]]
## [1] "CiNii OpenSearch - 対応分析 2017 2017"
## 
## 
## $link
## $link[[1]]
## [1] "https://ci.nii.ac.jp/opensearch/search?q=%e5%af%be%e5%bf%9c%e5%88%86%e6%9e%90&appID=j38sofo6PQBkh3Zl2Gt5&format=rss&count=200&year_from=2017&year_to=2017&REMOTE_ADDR2=126.235.212.127"
## 
## 
## $date
## $date[[1]]
## [1] "2018-11-09T22:05:43+09:00"
## 
## 
## $totalResults
## $totalResults[[1]]
## [1] "19"
## 
## 
## $startIndex
## $startIndex[[1]]
## [1] "1"
## 
## 
## $itemsPerPage
## $itemsPerPage[[1]]
## [1] "19"
## 
## 
## $items
## $items$Seq
## $items$Seq$li
## list()
## attr(,"resource")
## [1] "https://ci.nii.ac.jp/naid/40021429732"
## 
## $items$Seq$li
## list()
## attr(,"resource")
## [1] "https://ci.nii.ac.jp/naid/40021185987"
## 
## $items$Seq$li
## list()
## attr(,"resource")
## [1] "https://ci.nii.ac.jp/naid/120006243116"
## 
## $items$Seq$li
## list()
## attr(,"resource")
## [1] "https://ci.nii.ac.jp/naid/120006000156"
## 
## $items$Seq$li
## list()
## attr(,"resource")
## [1] "https://ci.nii.ac.jp/naid/40021559870"
## 
## $items$Seq$li
## list()
## attr(,"resource")
## [1] "https://ci.nii.ac.jp/naid/40021330481"
## 
## $items$Seq$li
## list()
## attr(,"resource")
## [1] "https://ci.nii.ac.jp/naid/40021195144"
## 
## $items$Seq$li
## list()
## attr(,"resource")
## [1] "https://ci.nii.ac.jp/naid/130007474484"
## 
## $items$Seq$li
## list()
## attr(,"resource")
## [1] "https://ci.nii.ac.jp/naid/130007422541"
## 
## $items$Seq$li
## list()
## attr(,"resource")
## [1] "https://ci.nii.ac.jp/naid/130006776985"
## 
## $items$Seq$li
## list()
## attr(,"resource")
## [1] "https://ci.nii.ac.jp/naid/130006302454"
## 
## $items$Seq$li
## list()
## attr(,"resource")
## [1] "https://ci.nii.ac.jp/naid/130006192952"
## 
## $items$Seq$li
## list()
## attr(,"resource")
## [1] "https://ci.nii.ac.jp/naid/130006179573"
## 
## $items$Seq$li
## list()
## attr(,"resource")
## [1] "https://ci.nii.ac.jp/naid/130006086145"
## 
## $items$Seq$li
## list()
## attr(,"resource")
## [1] "https://ci.nii.ac.jp/naid/130006077627"
## 
## $items$Seq$li
## list()
## attr(,"resource")
## [1] "https://ci.nii.ac.jp/naid/130005864949"
## 
## $items$Seq$li
## list()
## attr(,"resource")
## [1] "https://ci.nii.ac.jp/naid/130005466783"
## 
## $items$Seq$li
## list()
## attr(,"resource")
## [1] "https://ci.nii.ac.jp/naid/120006502028"
## 
## $items$Seq$li
## list()
## attr(,"resource")
## [1] "https://ci.nii.ac.jp/naid/120006342410"
## 
## 
## 
## attr(,"about")
## [1] "https://ci.nii.ac.jp/opensearch/search?q=%e5%af%be%e5%bf%9c%e5%88%86%e6%9e%90&appID=j38sofo6PQBkh3Zl2Gt5&format=rss&count=200&year_from=2017&year_to=2017&REMOTE_ADDR2=126.235.212.127"

totalResult に結果があることがわかるのでとりだせばよい。

「対応分析」でhitした論文数と累計

plot_hit2("対応分析",year_nn)

参考リンク

これまでのLTの記録

  • 2018/10/20 Tokyo.R#73LT 「CiNiiのAPIをRでたたいてみた」https://bit.ly/2AjEEXT
  • 2018/04/20 Tokyo.R#69LT「vcd*::mosaicで日本語を使うための wrapper をつくってそれをPackageにしてみた」https://bit.ly/2JQ4dms
  • 2018/03/03 Tokyo.R#68LT「その数量化大丈夫ですか?整数尺度と最適化尺度」https://bit.ly/2PVTZql
  • 2018/01/20 Tokyo.R#67LT「vcd*で日本語 (3)long formatが旧世界とのGateway」https://bit.ly/2PhpRWK
  • 2017/12/16 Tokyo.R#66 LT「vcd*/vcdExtraで日本語を使う (2)」https://bit.ly/2RJkpZu
  • 2017/09/23 Tokyo.R#65 LT 「二つのmosaic plot*と日本語表示」https://bit.ly/2Dv0t9A
  • 2017/03/18 Tokyo.R#59 LT 「『対応分析入門』の紹介」

懇親会参加します。コメントなど、よろしくお願いいたします!