国立国会図書館サーチAPIで書誌を検索する
国立国会図書館サーチ(NDLサーチ)は、国会図書館の蔵書だけでなく、全国の公共・大学図書館の所蔵、デジタルコレクション、視覚障害者等用データ、博物館の収蔵品までを横断して検索できる、日本最大級の書誌データベースです。APIが公開されていて、APIキーの登録も不要です。ただし方式が4つあってどれを使うか迷いやすく、また実際に叩くとタイムアウトやレート制限にすぐ当たります。このガイドでは、方式の選び方と、実際に叩いて確認した実務上の注意点を整理します。
まず知っておくべき:2024年にドメインが変わった
2024年1月5日に「NDLオンライン」と「NDLサーチ」が統合されてリニューアルされ、ドメインが `iss.ndl.go.jp` から `ndlsearch.ndl.go.jp` へ移行しました。ネット上の解説記事には旧ドメインを前提にしたものが今も多く残っています。
旧URLは新URLへリダイレクトされており、終了予定日は公表されていません。ただしリダイレクトに依存した実装はいつ壊れるか分からないので、新しい `ndlsearch.ndl.go.jp` を直接使ってください。参考にする記事の日付も確認したほうがよいでしょう。
なお、さらに古い SRW/Z39.50 方式は2020年3月2日に廃止済みです。
4つの方式の使い分け
APIは4方式が用意されています。用途がはっきり分かれているので、最初に選んでおくと迷いません。
**OpenSearch**(`/api/opensearch`)は、キーワードを渡すだけのシンプルな検索です。出力はRSS 2.0形式のXML。「とりあえずキーワードで引きたい」ならこれが最短です。**SRU**(`/api/sru`)は、CQLというクエリ言語で条件を組み立てる詳細検索用で、著者と出版年とISBNを組み合わせるといった複雑な検索に向きます。
**OpenURL**(`/api/openurl`)は著者名などの基本検索で、出力がHTMLなのでプログラムからの利用には向きません。**OAI-PMH**(`/api/oaipmh`)は検索用ではなく、更新されたデータを一括で収集(ハーベスト)するための仕組みです。データベースを丸ごとミラーしたい場合はこれになります。
普通の検索用途なら OpenSearch、条件を細かく指定したいなら SRU、という選び方で十分です。
OpenSearchの叩き方
エンドポイントは `https://ndlsearch.ndl.go.jp/api/opensearch` です。`any` にキーワード、`cnt` に取得件数を指定します。認証は不要です。ページングは `idx`(開始位置)を使います。
実測では、「統計学」で総ヒット63,754件、「こころ 夏目漱石」で2,079件が返りました。0件だった場合もエラーにはならず、HTTP 200 とともに `openSearch:totalResults` が 0 で `item` 要素が無い、という形になります。件数判定は本文を見てください。
レスポンスはRSS 2.0にDC-NDL(国会図書館のダブリンコア拡張)を混ぜたXMLです。`dc:title`(タイトル)、`dcndl:titleTranscription`(タイトルのよみ)、`dc:creator`(著者)、`dc:publisher`(出版者)、`dc:date`、`dc:identifier`(ISBN等)、`dc:subject`(分類・件名)といった要素が入ります。「よみ」が取れるのは日本語書誌ならではで、五十音順に並べたい場合に重宝します。
実務で必ず当たる:タイムアウトと429
このAPIで最初に驚くのが応答速度のばらつきです。実測では、4回叩いたうち2回が30秒でタイムアウトしました。curlで試したときも、同じクエリが40秒でタイムアウトし、リトライしたら5.3秒で返ってきた、ということがありました。数秒で返ることもあれば30秒を超えることもある、という前提で組む必要があります。タイムアウト値を短く設定していると、正常なリクエストが軒並み失敗します。
レート制限も実在します。短時間に連続でリクエストしたところ、`<error><code>429</code><message>Too Many Requests/同時アクセス数の上限に達したため、リクエストの制限を行っています。</message></error>` が実際に返ってきました。国会図書館は「同時リクエスト数に制限を設けている」と説明していますが、具体的な閾値は「数値の目安をお示しすることができません」として非公開です。
つまり、閾値が分からないまま自衛するしかありません。直列で叩く・間隔を空ける・429を受けたらバックオフして再試行する、という実装が前提になります。並列で一気に取得しにいくと確実に弾かれます。
書誌データの癖(正規化されていない)
書誌データは「図書館が持っている生のデータ」に近い形で返ってくるため、機械処理を前提とした正規化はされていません。実測で確認できた癖を挙げます。
まず、**ISBNとISBN13が同じ値**で入っているレコードがあります。`dcndl:ISBN` と `dcndl:ISBN13` の両方に `4-544-03039-0` という10桁形式が入っている、という具合です。ISBN13へ変換されないまま複製されているので、「ISBN13フィールドなら13桁だろう」と決め打ちすると壊れます。
次に、**著者名が重複します**。`<author>` の値が「竹内 清,竹内 清」のように同じ名前をカンマで並べたものになっているレコードを確認しました。著者情報は `author` / `dc:creator` / `dcndl:creatorTranscription` に分散しているので、どれを正とするか決めて、重複除去を挟む必要があります。
**識別子の体系がレコードの出自で変わる**のも厄介です。図書なら NDLBibID / ISBN / JPNO、雑誌記事なら NDLBibID のみ、大学リポジトリ由来なら NIIBibID / NSMARCNO、といった具合に、どこのデータベースから来たかで付く識別子が違います。「ISBNで名寄せする」という設計は、ISBNが付かないレコード(雑誌記事など)で破綻します。
最後に、**`description` の中身がHTML**です。CDATAの中に `<ul><li>タイトル:...</li></ul>` というHTMLが入っているため、XMLをパースしただけでは書誌詳細が取り出せず、その中のHTMLをもう一段パースする必要があります。
利用条件
APIキーは不要で、そのまま利用できます。ただしAPIで提供されるのは、国会図書館が提供元から許諾を得たデータのみです。
利用条件はデータの提供元によって変わります。非営利利用は提供元の条件次第で申請不要な場合がある一方、商用利用は申請が必要な場合があると説明されています。全国の図書館・博物館から集まった多様な出自のデータを扱っている以上、一律のライセンスにはなりません。商用サービスに組み込むなら、対象データの提供元と条件を確認してから進めてください。
実際に叩いてみる(NDLサーチ OpenSearch・登録不要)
国立国会図書館サーチの OpenSearch は登録不要で、title・creator などで図書・雑誌記事・デジタルコレクションを横断検索できます。レスポンスはRSS(XML)で、openSearch:totalResults に総件数、各 item に書誌が入ります。JSONではなくXMLパースが必要な点に注意します。
curl -s "https://ndlsearch.ndl.go.jp/api/opensearch?title=日本&cnt=1"
# 実際のレスポンス(抜粋・RSS/XML)
<rss ...>
<channel>
<title>日本 - 国立国会図書館サーチ OpenSearch</title>
<openSearch:totalResults>8295922</openSearch:totalResults>
<item>
<title>(書名)</title>
<dc:creator>(著者)</dc:creator>
</item>
</channel>
</rss>出典
元システムエンジニア。Web系アプリ開発6年+ソリューション9年、IT実務およそ15年。個人開発者として、政府オープンデータや各府省のAPIを実際に叩いて検証し、「何が取れるか」「実装時にどこで詰まるか」「どう活用するか」を一次検証にもとづいて記録しています。
運営者・検証方針について →