国立国会図書館サーチのAPIで本の書誌を確かめる。広告収入のあるサイトで使うときの条件も

本記事にはアフィリエイト広告(PR)を含みます。詳しくは広告・アフィリエイトについてをご確認ください。

このサイトで本を紹介するときは、書名・著者・出版社・版・発売年月・ISBN を、国立国会図書館サーチのAPIで確かめてから載せています。この記事では、そのとき使った OpenSearch の呼び出し方と、返ってくるデータの読み方、それから広告収入のあるサイトで使うときの条件をまとめます。

条件の部分は、個人のブログでもアフィリエイトをしていれば関係します。APIを使う前に一度読んでおくと安心です。

なぜ国立国会図書館サーチを使うのか

本の情報は Amazon の商品情報APIからも取れます。ただ、このAPIは直近30日で一定の件数が売れていないと使えません。始めたばかりのサイトでは、その条件を満たせませんでした。

国立国会図書館サーチなら、国内で出版された本の書誌を、版ごとに確かめられます。同じ書名の本でも、初版と改訂版が別々の書誌として出てくるので、「自分が読んだのはどの版か」を確かめるのにも向いています。

使えるAPI

国立国会図書館サーチには、検索用のAPIとして SRU、OpenSearch、OpenURL があります。ほかに、メタデータをまとめて取得するための OAI-PMH もあります。

私が使ったのは OpenSearch です。URLのパラメータで条件を指定するだけで、結果が RSS 形式の XML で返ってきます。いちばん手軽に試せます。

リクエストの例

書名で探すときは title を使います。cnt は返ってくる件数の上限です。

https://ndlsearch.ndl.go.jp/api/opensearch?title=リーダブルコード&cnt=5

ISBN が分かっている本は、isbn で1冊に絞れます。

https://ndlsearch.ndl.go.jp/api/opensearch?isbn=9784297127831

書名がうろ覚えのときは、any でキーワード検索ができます。「システム開発と具体と抽象」は書名にかぎかっこが入るので、書名どおりに打つ自信がなく、any=システム開発 具体と抽象 で探しました。

実際のリクエストでは、日本語の部分を UTF-8 で URL エンコードします。ブラウザのアドレス欄に貼る場合は、ブラウザがエンコードしてくれます。

返ってくるデータの読み方

結果の XML には、1冊ごとに item 要素が入っています。『良いコード/悪いコードで学ぶ設計入門』を探したときの結果から、必要な部分だけを抜き出すと次のようになります。

<item>
  <dc:title>良いコード/悪いコードで学ぶ設計入門 : 保守しやすい成長し続けるコードの書き方</dc:title>
  <dc:creator>仙塲, 大也</dc:creator>
  <dc:publisher>技術評論社</dc:publisher>
  <dcterms:issued>2022.5</dcterms:issued>
  <dc:identifier xsi:type="dcndl:ISBN">978-4-297-12783-1</dc:identifier>
</item>

それぞれの意味は次のとおりです。

  • dc:title は書名で、副題は「 : 」のあとに続く
  • dc:creator は著者で、「姓, 名」の形になっている
  • dcterms:issued は出版年月で、多くの本は「2022.5」のように年月まで
  • dc:identifier のうち xsi:type が ISBN のものが ISBN で、ハイフン付きのこともある

版の違いは dcndl:edition に入ります。同じ本を探したら、初版の書誌のほかに dcndl:edition が「改訂新版」、dcterms:issued が「2025.1」の書誌も見つかりました。このサイトで、読んだ版より新しい版を案内しているのは、こうして見つけた情報です。

なお、dcterms:issued の年月は、出版社が発表している発売日と1か月ずれていることがありました。『良いコード/悪いコードで学ぶ設計入門』の初版は、出版社のページでは2022年4月30日発売ですが、書誌では「2022.5」です。発売日を載せたい場合は、出版社のページもあわせて確認したほうが確実です。

必要な項目だけ取り出す

ブラウザで XML を開いて調べるときは、開発者ツールのコンソールで次のコードを実行すると、1冊1行の形で一覧にできます。

[...document.getElementsByTagName("item")].map((item) => {
  const text = (tag) =>
    [...item.getElementsByTagName(tag)].map((element) => element.textContent).join(" | ");
  const isbns = [...item.getElementsByTagName("dc:identifier")]
    .filter((element) => (element.getAttribute("xsi:type") ?? "").includes("ISBN"))
    .map((element) => element.textContent);
  return [
    text("dc:title"),
    text("dcndl:edition"),
    text("dc:creator"),
    text("dc:publisher"),
    text("dcterms:issued"),
    isbns.join(","),
  ].join(" / ");
});

検索結果には、本のほかに論文や雑誌の記事も混ざります。「リーダブルコード」で探したときも、書名にその言葉を含む論文がヒットしました。なので、出版社と ISBN が入っているかで、本の書誌かどうかを見分けています。

広告収入のあるサイトで使うときの条件

ここがいちばん大事なところです。国立国会図書館サーチのAPIは、利用目的によって手続きが変わります。

  • データを使って何らかの収益を得る場合は、営利目的にあたり、原則として利用申請が必要です。サイトの広告収入も、ここに含まれます。
  • ただし、データを提供している機関が、目的を問わず利用を許可しているデータは、申請しなくても使えます。

どのデータがどちらにあたるかは、「API提供対象データプロバイダ一覧」に載っています。国立国会図書館が作成した書誌データ(国立国会図書館蔵書など)は、クリエイティブ・コモンズ 表示 4.0 国際(CC BY 4.0)と互換の条件です。そのため、営利目的でも申請は要りません。

その代わり、次の表示が必要です。

  • APIを使うサイトには、国立国会図書館サーチのAPIを使っていることを書く
  • CC BY の条件として、出典とライセンスを示す

このサイトでは、フッターと運営者情報のページに、書誌の出典とライセンスを載せています。正直に書くと、最初は表示を入れ忘れていて、この記事を書くために利用条件を読み直して気づきました。

国立国会図書館が作成した書誌だけに絞って検索したいときは、dpid=iss-ndl-opac を付けます。公式のリクエスト例にも使われている指定です。

https://ndlsearch.ndl.go.jp/api/opensearch?title=リーダブルコード&dpid=iss-ndl-opac

ほかにも、同時にたくさんのリクエストを送らないこと、継続して使う場合は利用申請フォームから連絡先を知らせてほしいこと、が案内されています。私のように、本を1冊ずつ手で確かめる使い方なら負荷の心配はありません。ただ、まとめて取得するプログラムを書くときは、間隔を空けて呼び出すようにしてください。

条件や仕様は変わることがあるので、使う前に公式の「APIのご利用について」と「API提供対象データプロバイダ一覧」を確認してください。

⎇ main✓ 13 deps9 articles
UTF-8LFMDX