1. はじめに|書籍検索を自動化して業務効率UP!
書籍の検索って、意外と時間がかかりませんか?
たとえば、教育現場や研究機関、図書館などで「特定のテーマに関する書籍をまとめて探したい」という場面。いちいち検索サイトにアクセスして、検索ワードを入力して、目当ての本を見つけて……という作業を繰り返すのは、正直かなり面倒です。
そんなときに活躍するのが「Python+Web APIによる自動化」です!
この記事では、Cinii Books(国立情報学研究所が提供する書籍検索サービス)のWeb APIを活用して、インターネットから書籍データを取得し、Excelファイルとして保存するPythonスクリプトの作り方を解説します。
さらに今回は、ちょっと便利な工夫として、**ユーザーがコマンドラインでキーワードを入力できる「対話式スクリプト」**を採用。誰でも簡単に使えるようにしています。
また、ただスクリプトを動かすだけではなく、
- 取得したJSONデータの扱い方
- pandasによるデータ加工と出力処理
- メソッドチェーンを使ったスマートなコードの書き方
- エラー処理や条件分岐の実践例
といった、Python実務でも役立つテクニックも合わせて紹介していきます!
💡「書籍データをサクッと集めたい」
💡「PythonでAPIを使ってみたい」
💡「Excelへの出力処理まで自動化したい」
そんな方は、ぜひ最後まで読んでくださいね!
2. Cinii Books APIとは?無料で使える学術書検索API
今回のスクリプトで使うのは、Cinii Books(サイニィ・ブックス)というサービスのWeb APIです。
これは、国立情報学研究所(NII)が提供している日本の大学図書館などに所蔵されている書籍情報を検索できるデータベースで、誰でも無料で使うことができます。
📚 Cinii Booksってなに?
Cinii Booksは、全国の大学図書館・国立図書館などが所蔵する書籍の情報を検索できるWebサービスです。
たとえば、「Python」「医療」「民法」といったキーワードで検索すると、それに関連する書籍のタイトルや著者、出版年、出版社などの情報を一覧で取得できます。
しかも、アカウント登録やAPIキーの発行は一切不要。URLにキーワードを含めてアクセスするだけで、JSON形式のレスポンスをすぐに取得できるのが特徴です。
🌐 Web APIとしての特徴
Cinii BooksのWeb APIはとてもシンプルな設計で、以下のような特徴があります。
| 特徴 | 内容 |
|---|---|
| 利用料 | 無料(商用は注意) |
| 認証 | 不要(APIキー不要) |
| 出力形式 | JSON または XML |
| 主な情報 | タイトル、著者名、出版年、所蔵図書館など |
| URL構成 | クエリパラメータで検索条件を指定 |
たとえば、「Python」に関する書籍をJSON形式で取得するURLはこんな感じになります:
https://ci.nii.ac.jp/books/opensearch/json?q=Python
このURLにアクセスすれば、Pythonに関連する書籍の情報がJSON形式で返ってきます。
とても扱いやすいAPIなので、Python学習の実践教材にもピッタリです。
✅ どんな場面で使える?
このAPIは、以下のようなシーンで活用できます。
- 教育現場での資料収集(例:講義資料の検索)
- 学術研究での関連書籍の収集
- 図書館業務の効率化(例:特定ジャンルの新着本調査)
- 書籍リストの作成やExcelへの自動取り込み

今回作るスクリプトを少しカスタマイズするだけで、**自分専用の「書籍検索ツール」**に進化させることも可能です!
3. Pythonで対話式スクリプトを作ろう!
それではいよいよ、Pythonで書籍検索ツールを作る本編に入っていきましょう!
ここではまず、Cinii Books APIを使って書籍情報を取得する基本的な流れと、ユーザーがキーワードを入力できる「対話式」のスクリプトを作成する方法を紹介します。
💻 必要なライブラリをインポートしよう
今回使う主なライブラリは以下の3つです:
import requests # APIリクエストを送るため
import pprint # JSONデータを見やすく整形して表示
import pandas as pd # データの加工とExcel出力に使用
💡 pandasが未インストールの場合は、事前に pip install pandas openpyxl を実行しておきましょう。
🗣 input()でキーワードを受け取る
ユーザーがコマンドラインから検索キーワードを入力できるよう、以下のように input() 関数を使います:
keyword = input("検索したいキーワードを入力してください:")
これで、ユーザーが「Python」や「歴史」などのキーワードを自由に指定できるようになります。
🌐 Cinii APIで書籍データを取得する
次に、入力されたキーワードを使ってWeb APIにアクセスします。以下のように、requestsライブラリを使ってGETリクエストを送信します:
url = f"https://ci.nii.ac.jp/books/opensearch/json?q={keyword}&count=100&sortorder=3"
response = requests.get(url)
response.raise_for_status() # エラーハンドリング
APIからのレスポンスはJSON形式なので、次のようにしてPythonの辞書型に変換します:
data = response.json()
📋 データの中身を確認してみよう
データの構造を確認するために、pprintで中身を見てみましょう。
from pprint import pprint
pprint(data)
このようにして、APIから返ってきた内容を整形して確認できます。
レスポンス内の @graph → items → 各書籍の情報 という構造を理解しておくと、次のステップで役立ちます。
✨ ここまでのまとめ
これで、以下のような基本の流れが完成しました:
- ユーザーが検索キーワードを入力
- Web APIにアクセスして書籍情報を取得
- 取得データをPythonで扱える形式に変換
- 中身を確認できるよう整形表示

次は、このデータから「タイトル」「著者名」「出版年」などの情報を取り出して、Excelファイルに保存する方法を見ていきましょう!
4. 書籍データをExcelに保存する方法
前のセクションで取得したCinii Booksの書籍データ。
今回はその中から必要な情報だけを抜き出して、Excelファイルに保存する方法を解説していきます!
データを見やすく整理して保存すれば、あとから絞り込みや並べ替えも自由自在。業務でも大いに役立ちますよ!
🎯 どの情報を取り出す?
Cinii APIから取得したデータには、たくさんの情報が含まれていますが、今回は以下の3つに絞って抽出します:
| 抽出する情報 | JSON内のキー名 |
|---|---|
| 書籍のタイトル | title |
| 著者名 | dc:creator |
| 出版年 | dc:date |
これらは data["@graph"][0]["items"] の中に、リスト形式で格納されています。
🛠 書籍データの抽出処理
以下のコードで、必要な情報だけを取り出してリスト化します:
items = data.get("@graph", [])[0].get("items", [])
books = []
for item in items:
title = item.get("title", "不明")
author = item.get("dc:creator", "不明")
year = item.get("dc:date", "不明")
books.append({
"タイトル": title,
"著者名": author,
"出版年": year
})
💡 書籍によっては「著者名」や「出版年」が空欄になっていることもあるので、.get()で安全に取り出しています。
📊 pandasでDataFrameに変換
リストに格納された書籍データをpandasでデータフレームに変換します:
df = pd.DataFrame(books)
見やすく整った表形式になります!
💾 Excelファイルとして保存する
最後に、検索キーワードをファイル名に使ってExcelに保存します:
filename = f"{keyword}_books.xlsx"
df.to_excel(filename, index=False)
print(f"Excelファイルに保存しました:{filename}")
📂 保存先はスクリプトを実行したフォルダと同じ場所になります。
🧪 動作確認してみよう!
ここまでの処理を組み合わせれば、次のような流れが完成します:
検索したいキーワードを入力してください:人工知能
→ Cinii APIにリクエスト送信
→ 書籍の一覧を取得
→ Excelファイル「人工知能_books.xlsx」に保存完了!
💡 ちょっと便利な工夫も!
- 検索結果の最大件数(count)を100件に設定して、より多くの情報を取得
- 出力ファイル名に検索ワードを含めて、後から探しやすく
- 列名に日本語を使って、Excelでも読みやすく!
5. エラーハンドリングと分岐処理のコツ
プログラムを実際の現場で使うには、「エラーが起きたときの対応」や「想定外の入力への対処」も重要です。
今回は、2つのケースに対応する処理を加えて、より信頼性の高いスクリプトに仕上げていきましょう。
⚠️ ケース①:API自体にアクセスできない
APIのURLが間違っていたり、ネットワークの問題があったりすると、requests.get() でエラーが発生する可能性があります。
そんなときは、以下のように try-except ブロックと raise_for_status() を使って対処します。
try:
response = requests.get(url)
response.raise_for_status()
except requests.exceptions.RequestException as e:
print("APIへの接続に失敗しました:", e)
exit()
💡 raise_for_status() はHTTPエラー(404や500など)を検出し、例外として報告してくれます。
🚫 ケース②:検索結果が0件だった場合
キーワードに合う書籍が一件も見つからないこともあります。
これは「失敗」ではなく「正常な結果」ですが、処理を続けても意味がないので、以下のように分岐を加えます。
graph = data.get("@graph", [])
if not graph or "items" not in graph[0]:
print("該当する書籍が見つかりませんでした。")
exit()
このチェックにより、itemsキーがない場合は「0件」と判断し、ユーザーにメッセージを出して終了できます。
✅ 安全な書き方まとめ
エラーハンドリングや分岐を含めた、基本的な流れはこんな感じになります:
try:
response = requests.get(url)
response.raise_for_status()
data = response.json()
except requests.exceptions.RequestException as e:
print("API通信エラー:", e)
exit()
graph = data.get("@graph", [])
if not graph or "items" not in graph[0]:
print("検索結果が0件でした。")
exit()
✨ なぜこれが大事なの?
- ユーザーが安心して使える
- 予期しないクラッシュを防げる
- エラーの原因が分かりやすくなる
- ログや運用の自動化にもつながる

実務でスクリプトを使う場合、「何が起きても止まらないコード」が信頼されるコードです!
6. コードを美しく!メソッドチェーンでリファクタリング
スクリプトが正しく動くようになったら、次はコードの見た目や読みやすさを整える番です。
今回は、Pythonらしくスッキリとした記述に変えるために、メソッドチェーンを使ったリファクタリング方法をご紹介します!
🔄 メソッドチェーンって何?
メソッドチェーンとは、複数の処理をドット(.)でつないで一気に書く方法です。
一時変数を使わずに処理を連続して実行できるので、コードがシンプルになりやすいです。
以下のような処理を…
df = pd.DataFrame(books)
df = df.rename(columns={"dc:creator": "著者名", "dc:date": "出版年"})
df.to_excel(filename, index=False)
こんなふうにまとめて書けます:
pd.DataFrame(books) \
.rename(columns={"dc:creator": "著者名", "dc:date": "出版年"}) \
.to_excel(filename, index=False)
🧼 改行とインデントで読みやすく!
ただし、行が長くなると読みにくくなるので、バックスラッシュ(\)を使って改行するのがポイントです。
タブやスペースでインデントをそろえることで、コードの流れがひと目でわかります。
🎨 カラム名の変更は先にやるとスッキリ!
書籍データをExcelに保存する際、カラム名(列名)を「dc:creator」のままにすると分かりづらいですよね。
そこで、rename()メソッドを使ってあらかじめ日本語に変換しておくと、あとで操作しやすくなります。
df = pd.DataFrame(books).rename(columns={
"title": "タイトル",
"dc:creator": "著者名",
"dc:date": "出版年"
})
💡 メソッドチェーンのメリット
| メリット | 内容 |
|---|---|
| 見た目がスッキリ | 無駄な変数が減る |
| 保守がしやすい | 処理の流れが直線的に見える |
| 処理の流れが明快 | データの加工手順が追いやすい |
ただし、複雑な処理はメソッドチェーンにせず、分けて書いた方が読みやすい場合もあります。
読み手の立場に立って、バランスを考えるのがコツですね!
✅ 実際の例(完成版)
pd.DataFrame(books) \
.rename(columns={
"title": "タイトル",
"dc:creator": "著者名",
"dc:date": "出版年"
}) \
.to_excel(f"{keyword}_books.xlsx", index=False)

このように、データフレームの作成 → カラム名の変更 → Excel出力 までを一気に記述できるので、とてもスマートです。
7. 実行例と動作確認
ここまでで、検索キーワードの入力 → 書籍情報の取得 → Excel出力までを自動で行うPythonスクリプトが完成しました。
では実際に、いくつかのキーワードを使って動作確認をしてみましょう!
🧪 実行例①:「Python」で検索してみる
検索したいキーワードを入力してください:Python
▶︎ 実行結果:
Python_books.xlsxというファイルが出力される- Excelファイルには、Pythonに関する書籍(タイトル、著者名、出版年)が100件分一覧に!
📸 Excelファイルの中身の例:
| タイトル | 著者名 | 出版年 |
|---|---|---|
| Pythonプログラミング入門 | 山田太郎 | 2021 |
| 実践Pythonデータ分析 | 鈴木一郎 | 2022 |
| Pythonと機械学習の世界 | 田中花子 | 2020 |
🧪 実行例②:「物理」で検索してみる
検索したいキーワードを入力してください:物理
▶︎ 実行結果:
物理_books.xlsxというファイルが生成され、物理関連の学術書情報がリストアップされます。
🧪 実行例③:「ギリシャ語」で検索
検索したいキーワードを入力してください:ギリシャ語
▶︎ 実行結果:
- 書籍数はやや少なめですが、古典や言語学に関する書籍が数件表示されます。
- 件数が少なくても、正常に動作していることが確認できます。
🚫 検索結果が0件だった場合は?
検索したいキーワードを入力してください:あいうえおかきくけこ
▶︎ 実行結果:
該当する書籍が見つかりませんでした。
このように、存在しないキーワードに対しても優しく対応できるようになっています!
✅ テスト成功のポイント
- いろんなジャンルのキーワードで動作するか?
- 出力されたExcelが正しく開けるか?
- 異常系(空検索・存在しない語)でもクラッシュしないか?

上記のような観点からテストすれば、安心して業務でも使えるスクリプトになります。
8. まとめ|API×Pythonで情報収集も自動化できる時代!
今回は、PythonとCinii Books APIを使って、
- ユーザーがキーワードを入力
- 書籍情報をWebから自動取得
- Excelファイルに出力して保存
という一連の流れを、対話形式のスクリプトとして作成してきました。
しかも、ただ動くだけではなく…
input()を使ったユーザー入力対応- JSONの取り扱いと必要項目の抽出
pandasによるデータ加工to_excel()によるExcel出力try-exceptを使ったエラーハンドリング- メソッドチェーンでコードをスッキリ整形
といった、Python実務で必須のテクニックも自然に学べる内容になっています。
🧰 このスクリプトが使えるシーン
- 研究資料の事前収集
- 大学・図書館の業務効率化
- 新刊情報の自動まとめ
- 書籍リストの定期更新ツールとして再利用
さらに、Cinii APIは追加パラメータも豊富なので、
- 出版社で絞り込む
- 出版年の範囲を指定する
- 特定の図書館だけで絞る
といった応用的な検索にも対応可能です。
🚀 情報収集も「自動化」がスタンダードに
今までは、手作業で検索して、コピペして…という情報収集が当たり前でしたが、
PythonとAPIを組み合わせれば、その作業も一瞬で完了します。
時間をかけずに正確なデータを集めたい。
そんなとき、今回のような小さな自動化スクリプトが大きな力になります。
あわせて読みたい
当ブログでは、今回のようなPythonを使った業務効率化・自動化に役立つ記事を多数ご紹介しています。あわせて以下の記事もチェックしてみてください!
- 🔗 Pythonで為替レートを自動取得してExcelに保存する方法【初心者向け】
⇒ 為替APIからレートを取得し、Excelファイルに自動保存する手順を解説しています。 - 🔗 【Python×Gmail API】メール送受信&添付ファイル操作を自動化する方法
⇒ メール処理をPythonで一括管理したい方におすすめの内容です。 - 🔗【Python株価分析】データ取得・可視化・予測まで完全ガイド!
⇒ 株価情報をAPIで取得し、グラフ化・予測まで行う分析系の応用記事です。
よくある質問(Q&A)
- QCinii Books APIの利用に制限や登録は必要ですか?
- A
登録不要・無料で利用できます。ただし商用利用や大量アクセスには注意が必要です。詳細はCiniiの利用規約をご確認ください。
- Q出力されたExcelファイルが文字化けします。どうすれば?
- A
openpyxlを使って出力していれば基本的に文字化けしませんが、Excelのバージョンや文字コードによっては表示が乱れることも。to_excel()の引数にencoding="utf-8-sig"を追加してみてください(ただし.xlsx形式では不要です)。
- Qデータ数が100件を超える場合、どうすれば全件取得できますか?
- A
Cinii APIは1回のリクエストで取得できる件数が最大100件です。
startパラメータを使ってページを分けることで全件取得も可能です(複数回リクエストする必要があります)。







※当サイトはアフィリエイト広告を利用しています。リンクを経由して商品を購入された場合、当サイトに報酬が発生することがあります。
※本記事に記載しているAmazon商品情報(価格、在庫状況、割引、配送条件など)は、執筆時点のAmazon.co.jp上の情報に基づいています。
最新の価格・在庫・配送条件などの詳細は、Amazonの商品ページをご確認ください。