1
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

国立国会図書館のAPIを利用してISBNから書籍情報を取得する

Last updated at Posted at 2025-02-18

1.国立国会図書館APIについて

今回はpythonとopensearchを用いて書籍情報を取得します。

ISBNを用いて一致する書籍を探し、タイトル・著者名などの書籍情報を取得し、使いやすく整形して辞書型で返す関数型のプログラムを作成しました。

以前にも似たような記事を書いていたのですが、やや処理が冗長だったのと取得可能な書籍情報の整理ができていなかったので、再度記事を書きました。

以下のページなどを参考にしています。

2.プログラムコードとデータ取得の実例

国立国会図書館のAPIはレスポンスをXMLで返してくるので、これを辞書型にパースするため、xmltodictを利用しています。

辞書に変換されたXMLファイルは構造がやや入れ子になっているので、使う情報を整理しています。
XMLファイルの構造がやや複雑である点に注意してください

pprintは結果の確認のために使用しています。必要なデータのみを取得するように適宜変えてみてください。

一応isbnをもとに書籍情報を取得するので、isbnを取得する意味はないのですが、当然国立国会図書館のデータの中にはあるので、# 辞書型を整理の部分を見てもらえればどのようにISBNを取得しているかわかるという意味でisbn_dataとしておきました。

ここまでくればjsonにしてみたり、isbnのリストをループさせて書籍情報を連続で取得したりできると思います。

example.py
import requests
import xmltodict
import pprint

# ISBNを使って書誌情報を取得
def fetch_book_info(isbn):
    # NDLサーチAPI(国立国会図書館の説明を参照)
    base_url = "https://iss.ndl.go.jp/api/opensearch"
    
    # APIリクエストのパラメータを設定
    params = {
        'isbn': isbn,
        'format': 'xml'
    }

    # リクエストを取得
    response = requests.get(base_url, params=params)

    # XMLを辞書型に変換
    book_info = xmltodict.parse(response.text)

    # 入れ子になった辞書型を整理し、必要と思われる情報のみ取得
    book_dict = {
    "author": book_info['rss']['channel']['item']['author'], # 著者
    "category": book_info['rss']['channel']['item']['category'], # カテゴリ
    "creator": book_info['rss']['channel']['item']['dc:creator'], # 作者
    "publication_year": book_info['rss']['channel']['item']['dc:date']['#text'], # 発行年
    "description": book_info['rss']['channel']['item']['dc:description'], # 説明
    "pages": book_info['rss']['channel']['item']['dc:extent'], # ページ数
    "isbn_data": book_info['rss']['channel']['item']['dc:identifier'][0]['#text'], #ISBN
    "publisher": book_info['rss']['channel']['item']['dc:publisher'], # 出版社
    "call_number": book_info['rss']['channel']['item']['dc:subject'][1]['#text'], # 請求記号
    "title": book_info['rss']['channel']['item']['dc:title'], #タイトル
    "author_kana": book_info['rss']['channel']['item']['dcndl:creatorTranscription'], # 作者カナ表記
    "price": book_info['rss']['channel']['item']['dcndl:price'], # 価格
    "series_title": book_info['rss']['channel']['item']['dcndl:seriesTitle'], # シリーズ名
    "series_title_kana": book_info['rss']['channel']['item']['dcndl:seriesTitleTranscription'], # シリーズ名カナ表記
    "title_kana": book_info['rss']['channel']['item']['dcndl:titleTranscription'] #タイトルカナ表記
    }

    """ 変数に代入する場合の例
    author = book_info['rss']['channel']['item']['author'] # 著者
    category = book_info['rss']['channel']['item']['category'] # カテゴリ
    creator = book_info['rss']['channel']['item']['dc:creator'] # 作者
    publication_year = book_info['rss']['channel']['item']['dc:date']['#text'] # 発行年
    description = book_info['rss']['channel']['item']['dc:description'] # 説明
    pages = book_info['rss']['channel']['item']['dc:extent'] # ページ数
    isbn_data = book_info['rss']['channel']['item']['dc:identifier'][0]['#text'] #ISBN
    publisher = book_info['rss']['channel']['item']['dc:publisher'] # 出版社
    call_number = book_info['rss']['channel']['item']['dc:subject'][1]['#text'] # 請求記号
    title = book_info['rss']['channel']['item']['dc:title'] #タイトル
    author_kana = book_info['rss']['channel']['item']['dcndl:creatorTranscription'] # 作者カナ表記
    price = book_info['rss']['channel']['item']['dcndl:price'] # 価格
    series_title = book_info['rss']['channel']['item']['dcndl:seriesTitle'] # シリーズ名
    series_title_kana = book_info['rss']['channel']['item']['dcndl:seriesTitleTranscription'] # シリーズ名カナ表記
    title_kana = book_info['rss']['channel']['item']['dcndl:titleTranscription'] #タイトルカナ表記
    """

    return book_dict

# ISBNを指定して情報を取得
isbn = '9784043898039' 
d = fetch_book_info(isbn)

# 結果を整形して表示
pprint.pprint(d)

""" 結果
{'author': '有川, 浩, 1972-,有川浩 [著]',
 'author_kana': 'アリカワ, ヒロ, 1972-',
 'call_number': '913.6',
 'category': ['図書', ''],
 'creator': '有川, 浩, 1972-',
 'description': ['メディアワークス2007年刊の加筆、訂正', '2010'],
 'isbn_data': '978-4-04-389803-9',
 'pages': '444p',
 'price': '667円',
 'publication_year': '2010',
 'publisher': ['角川書店', '角川グループパブリッシング (発売)'],
 'series_title': '角川文庫 ; 16082',
 'series_title_kana': 'カドカワ ブンコ ; 16082',
 'title': '塩の街',
 'title_kana': 'シオ ノ マチ'}
"""

3.最後に

何かの足しになれば幸いです。

1
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?