見出し画像

国立国会図書館APIを使いやすくするためのPythonライブラリを作成しました

とある個人プロダクトを作ろうと思いついた時に、自分で欲しいなと思ったたのもあり、Pythonでとあるライブラリを作成してみました。

今回開発したもの

Jpndlpyという名前の国立国会図書館から情報を取得するHTTPクライアントライブラリを作成しました。

国立国会図書館は、書籍タイトルや著者などの図書情報をAPIとして公開しています。国立国会図書館のAPIはいろんなプロトコルでAPIを公開しており、今回はOpenSearch形式のAPIからHTTPで図書情報を取得するためのPythonから使えるHTTPクライアントのライブラリを作成しました。

GitHub内などを探してみても同じような物を作っている方がいなかったため、自分が欲しかったというのもあり、開発してみました。

PyPiにも公開しましたので、随時アップデートしていく予定です。

国立国会図書館とは

国立国会図書館とは、日本国内で発行された全ての出版物が納入されている図書館です。全ての出版物とは、漫画・雑誌・小説・専門書などの全ての書籍はもちろんの事、新聞や日本国憲法の資料や法律関連の物なども納入されています。

国立国会図書館は東京にある本館と京都にある関西館、国会議事堂内にある国立分館の3つからなります。

ただし、こちらの質問コーナーによれば、日本国内で発行されたすべての出版物は国立国会図書館への納本の義務があるそうですが、納本制度を知らない方もいるため、全ての出版物があるわけではないそうです。恐らく、技術書典などの出版物も納本の対象かもしれませんが、納めている方はほとんどいないのかなと思います。

しかし、日本国内のそこそこの出版社であれば、流石に国立国会図書館には納本されています。本屋で見かけるようなものであれば、必ず登録されているはずです。(詳しくは知りませんが、本屋に納めるには、ISBNコードが必ず必要なはずです。ISBNを取得するには、恐らく納本しなければいけないはずです。)

作った経緯など

技術書などの古い専門書はもちろんのこと、新しい技術書などの情報を網羅して公開している所は無いかなと探していたところ、国立国会図書館サーチというのを見つけました。全ての書籍を扱ってくれているので、こんな便利なものを公開してくれて大変ありがたいと思いました。

ただ少し残念だったのが、xml形式でしか対応していなかったことです。(行政みたいなお硬い組織だから仕方ないのもあるかもしれませんが・・・)

requestsを使って図書情報を取得しても、xmlをパースする処理を書くのをいちいちやるがめんどくさいのもあったため、json形式で取得できるようにしました。

ライブラリ自体はrequestsのラッパーでもあり、内部でxmlを整形処理してjsonに変換するようにしています。

導入方法

pypiに公開しているため、pip経由でインストールができます。

$ pip install jpndlpy

使い方

詳しい使い方等は、ドキュメントを整備しきれていないため、後々専用のドキュメントのページを用意する予定ですが、基本的な使い方は以下になります。

図書情報のタイトルが「python」が含まれる書籍を2つだけ取得するコードは以下です。to_json()メソッドで辞書型で情報を返ってきます。

#!/usr/bin/env python
# -*- coding: utf-8 -*-

from jpndlpy import JapanNdlClient

jndlclient = JapanNdlClient()
response = jndlclient.search_text(title="python", cnt=2)

print(response.to_json())

search_text()メソッドで引数で指定できるもの

dpid : str
    データプロバイダID
dpgroupid : str
    データプロバイダグループID
any : str
    すべての項目を対象に検索
title : str
    タイトル
creator : str
    作成者
publisher : str
    出版社
digitized_publisher : str
    デジタル化した製作者
ndc : str
    分類(NDC)
from_date : str
    開始出版年月日(YYYY、YYYY-MM、YYYY-MM-DD)
until_date : str
    終了出版年月日(YYYY、YYYY-MM、YYYY-MM-DD)
cnt : int
    出力レコード上限値(省略時は200 とする)
idx : int
    レコード取得開始位置(省略時は1 とする)
isbn : str
    ISBN
    10 桁または13 桁で入力した場合は、10 桁、13 桁
    の両方に変換して完全一致検索を行う。
    それ以外の桁で入力した場合は前方一致検索を行う
mediatype : int
    資料種別
    国立国会図書館サーチの詳細検索の資料種別に対応
    “1”:本
    “2”:記事・論文
    “3”:新聞
    “4”:児童書
    “5”:レファレンス情報
    “6”:デジタル資料
    “7”:その他
    “8”:障害者向け資料(障害者向け検索対象資料)
    “9”:立法情報

現状の問題点

一応pypiに公開はしていますが、まだまだ問題点があるため、随時アップデートしていきます。現状は機能面などで、以下の問題点があります。

・一度のリクエストでは取得できる最大件数は 500 件までという制限

これはAPIの仕様上で仕方ない面もあるため、500件以上ある場合は、一度では500件までしか取得できません。そのため、500件以上ある場合は内部で複数回リクエストを送って、結合処理を加えなければいけません。

・ndc(分類)が複数指定ができない

ndcとは図書のカテゴリのことです。これもAPIの仕様上で複数指定ができません。そのため、現状はndcは一つしか指定できませんが、機能追加ではライブラリ側で複数指定をして、内部で複数回リクエストを送って結合処理を付ける予定です。

・API自体がレスポンスが遅い

APIがレスポンスが返ってくるのが結構遅いです。こちらの記事によれば、楽天、Google、国立国会図書館、OpenBDの4つでベンチマークの比較したところ、圧倒的に一番遅いそうです。ここに関しては流石に僕の力で手が出せない所です。

今後の機能追加予定

上記で問題点なども上げているため、使いやすいように随時機能追加はしていきたいなと考えています。

・500件以上の場合は一度で取得できるようにする
・ndc(分類)を複数指定できるようにする
どちらも内部でマルチスレッドなどで複数回リクエストを送って、差分などを内部結合できるようにする予定です。

・書影(サムネイル)情報の取得
図書のサムネイルのURLなども取得できるようにしたいです。ここに関しては、OpenBDの方が早いため、OpenBDから取得できるようにするかもしれません。

・asyncioでの取得
jpndlpyは、内部ではrequestsを使って取得しています。内部で複数回リクエストを送るにしても、相当な量の図書になれば、同期的では時間がかかりそうなため、非同期で徐々に取得していくようにする必要があるかもしれません。もしかしたら、requestsではなく、aiohttpを使うかもしれません。

・パフォーマンスの改善
requestsを使用していたり、内部でいろんな整形処理などを挟んでいるため、取得する図書情報の量が多い場合は、最終的にjsonとして整形されて取得できるには相当な時間がかかるかもしれません。
ここに関しては、ボトルネックとなる部分はCythonなどを使用していけば、改善できるかなと考えています。

使う際の注意

ライブラリのライセンス自体はBSDライセンスのため、商用利用をしていただいてもかまいません。

ただし、国立国会図書館側のAPIに対してリクエストを送るため、大量アクセスなどには注意をしてください。API側で同時接続数には制限を設けていたり、一定数の大量アクセスと判断されれば、遮断等の処置を行うそうです。

また以下の使用制限があるため、商用利用などを利用する際などは以下の点を良く読んで注意してください。

1.利用条件
非営利目的での利用を前提としますが、営利目的でも後述の利用申請を行ない許可された場合は利用可能です。公的/私的、個人/団体の別は問いません。

詳しくはこちらを読んでください。


不具合点など、追加してほしい機能などのご要望があれば、是非twitterやnoteでコメンドなどをしていただければ幸いです。GitHubへのプルリクなどもお待ちしています!

この記事が気に入ったらサポートをしてみませんか?