CiNii Web API 2

(承前)

実用上の問題としては、ライブラリがないことが一番の障害だ。 CiNii の公式サイトに見当たらないし、利用者の「試してみた」記事にも無い。 まぁちょっと試してみる程度の動機ではそれなりのコードを書く気にも ならんだろう。しかし NII は過去にアプリコンテストなどを開催しているが、 そんなコンテストするよりは主要言語用のライブラリを整備した方が よっぽど利用者が増えると思うのだが、本末を間違えてるんじゃないのかそれ。

まぁいい。

さて python で書くとすると requests が便利だが、requests.Response に json() という JSON パーサがあるようなので、これを使うことにした。 つまり、書誌情報を CiNii Web API から JSON-LD 形式で取得し、これを requests の JSON パーサで python オブジェクト化してから取り出す。

JSON データを解析したりしながら約 2日、出来たのが これ 。元々の JSON-LD 形式というのが 妙に煩雑なせいか、不格好なコードになってしまった。

ciniiwebapi.py の使い方

Python 2.7用。その他のバージョンではテストしていない。

  1. CiNii からデベロッパーID を取得しておく。
  2. requests をインストールしておく。
  3. ciniiwebapi.py を適当な場所に置く。

以下、テストコード。NAID 110009810897 の論文のタイトルを取り出す。

>>> import ciniiwebapi
>>> cwapi = ciniiwebapi.CWAPI("your developer_id")
>>> cite = cwapi.query("110009810897")
>>> cite.title
「研究データ公開」における人材と体制の問題 : 研究図書館の可能性(学術情報)

dir() を取れば抽出可能な項目が判る。

>>> dir(cite)
['authors', 'authors_en', 'authors_num', 'pages', 'publication', 'publication_en', 'publisher', 'publisher_en', 'title', 'title_en', 'volume', 'year']

項目によっては list になっていたり unicode になっていたりするので、 そこは適当に処理する。

>>> for i in dir(cite):
...  data = getattr(cite, i)
...  if isinstance(data, list):
...    data = u", ".join(data)
...  if isinstance(data, unicode):
...    data = data.encode("utf-8")
...  print "{}: {}".format(i, data)
...
authors: 真板 英一
authors_en: Maita Eiichi
authors_num: 1
pages: 81-86
publication: 日本生態学会誌
publication_en: Japanese Journal of Ecology
publisher: 日本生態学会
publisher_en: The Ecological Society of Japan
title: 「研究データ公開」における人材と体制の問題 : 研究図書館の可能性(学術情報)
title_en: Professions and facilities for the research data publication : the potential of research libraries(News)
volume: 64
year: 2014

この程度のものでも作るのにそれなりの時間がかかる。 それが節約できるかどうかは開発者にとっては無視できないと 思うのだが、そう思う人は少ないのだろうか。