国立国会図書館サーチの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提供対象データプロバイダ一覧」を確認してください。