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.最後に
何かの足しになれば幸いです。