「気になるテーマの書籍を一覧でほしい」「研究テーマに合う本をサクッと洗い出したい」——そんな願いを叶えてくれるのがPythonとWeb APIの組み合わせです。コマンドラインから検索ワードを入力するだけで、大学図書館の蔵書情報がExcelファイルにまとまって出力される。そんな“自分専用の検索ツール”が、わずか数十行のコードで作れてしまいます✨
使うのは、登録不要・無料で叩けるCiNii Books API。大学図書館の蔵書を横断検索できる定番サービスで、レポート・論文・読書ノートづくりの強力な味方になってくれます。Pythonのrequestsでデータを取って、pandasでDataFrameに整形して、to_excel()で書き出す——この一連の流れを身につければ、他のWeb APIにもそのまま応用できる“横展開できるスキル”が手に入ります。
処理を分解すると、ゴールまでの道筋がスッと見えてきます。
input()でキーボードから検索キーワードを受け取るPythonの組み込み関数input()を使うと、ターミナルやコマンドプロンプトから入力された文字列をそのまま変数に格納できます。これだけで“対話型ツール”の基本骨格が完成です。
def main():
word = input("検索キーワード:")
print(word)
if __name__ == "__main__":
main() 実行すると「検索キーワード:」と表示されてカーソルが点滅。好きな単語を入れてEnterを押せば、その文字列がwordに代入されます。何度でも違うキーワードで再実行できる柔軟さが魅力です。
CiNii Books APIのドキュメントには、ベースURLとクエリパラメータの一覧が載っています。今回はJSONで結果を受け取りたいのでformat=json、フリーワード検索なのでq=検索ワードを指定します。
import os
import requests
import pprint
def main():
word = input("検索キーワード:")
url = (
"https://ci.nii.ac.jp/books/opensearch/search"
f"?format=json&q={word}"
)
res = requests.get(url)
res.raise_for_status()
pprint.pprint(res.json())
if __name__ == "__main__":
main() requests.get()が失敗してもPythonは勝手に止まってくれません。raise_for_status()を呼んでおけば、HTTPエラー(404・500など)の際に例外を発生させ、後続の処理が暴走するのを防げます。Web API活用の鉄則です。
受け取ったJSONをそのままprint()するとぐちゃっとした1行になりがち。pprint.pprint()を使えば、辞書やリストがインデント付きで読みやすく整形されます。デバッグ作業の時短アイテム✨
CiNiiのレスポンスは入れ子構造になっていて、書籍情報は@graph[0]["items"]の中にリストで入っています。リストの要素数は常に1つなので、[0]で辞書だけを取り出すのがコツです。
graph = res.json()["@graph"][0]
if "items" not in graph.keys():
print("該当する書籍は見つかりません")
return
items = graph["items"] 該当書籍が0件のケースは“不具合”ではなく“正常な検索結果”。例外を投げずにprint()+returnでやさしく終わらせるのが親切設計です。一方、URLミスやサーバー障害はraise_for_status()でしっかり例外化——この切り分けが堅牢なスクリプトの第一歩です。
pandasのDataFrameは長い文字列を省略表示するため、CiNiiのデータをそのまま見ると中身が読めません。set_option()で表示幅を広げてあげれば、デバッグがぐっとはかどります。
import pandas as pd
pd.set_option("display.max_colwidth", 20) 「列を絞る → 名前を日本語に変える → Excelに書き出す」を1つの式で繋げて書けるのがメソッドチェーン。中間変数を作らずに済むので、コードがスッキリします。
df = pd.DataFrame(graph["items"])
(df
.rename(columns={
"title": "タイトル",
"dc:creator": "著者名",
"dc:date": "出版年",
})
.loc[:, ["タイトル", "著者名", "出版年"]]
.to_excel(f"{word}.xlsx")) 全体を丸括弧()で囲むのがポイント。これでメソッドごとに改行しても“1つの式”として扱われ、可読性が一気に向上します。
デフォルトでは20件しか取得できないうえ、出版年順でもありません。クエリパラメータにsortorder=4(出版年降順)とcount=100を追加すれば、最新の書籍100件まで一気に取得できます。
url = (
"https://ci.nii.ac.jp/books/opensearch/search"
f"?format=json&q={word}"
"&sortorder=4&count=100"
) 💡 同じ仕組みは「Qiitaの記事検索」「楽天ブックスの書籍情報」「Open Weather Mapの天気情報」など、JSONを返すあらゆるWeb APIにそのまま応用できます。1つ作れば横展開がきくのが、API活用スキルの最大の武器です。
Web API・JSON操作・pandasと、複数のスキルが交差するこのテーマ。手元の環境と教材を整えるだけで、学習スピードは段違いに伸びます。実際に手を動かす時間を増やせるアイテムを厳選しました💪
標準ライブラリ・例外処理・パッケージ管理など“Pythonらしい書き方”を体系立てて解説。今回作ったスクリプトを「もっと美しく」リファクタリングするヒントが詰まっています。
pandasのDataFrame操作を、実データを使ったハンズオンで丁寧に解説。loc・rename・to_excelなどの“使えるテクニック”が一気に身につきます。
APIの設計・利用・エラーハンドリングまで網羅した名著。CiNiiのような外部APIをもっと深く使いこなしたい人に必携の一冊です。
左にコード、右にAPIドキュメント&生成されたExcelを並べると、確認・修正のサイクルが劇的に速くなります。USB-C一本で接続できるモバイルモニターは、机が狭くても気軽に2画面化できる頼れる相棒です。
対話型ツールはトライ&エラーの連続。指への負担を減らす静音赤軸のメカニカルキーボードがあれば、集中時間が伸びてバグ解決のスピードもグッと上がります。
はい、登録不要・無料で利用できます。ただし大量リクエストや商用利用については公式ガイドラインの確認をおすすめします。学習や個人利用の範囲であれば、安心して試せる気軽さが魅力です。
「ヒット0件」は不具合ではなく“正常な検索結果”だからです。一方、URLミスやサーバーダウンによる失敗は不具合なのでraise_for_status()で例外化。「ユーザーが想定外の状態」と「システムが想定外の状態」を切り分ける設計が、堅牢なスクリプトの基本です。
結果は同じなのでお好みでOKですが、メソッドチェーンには「中間変数を作らなくていい」「変数名を考える手間が省ける」というメリットがあります。慣れないうちは変数代入で書いて、慣れたらチェーン化していく流れがおすすめです。
はい、requests.get()+JSON解析+pandas整形+Excel出力という流れは、ほぼ全てのWeb APIに共通します。Qiita・楽天・OpenWeatherMap・Alpha Vantageなど、興味のあるテーマで同じ手順を試すと、知識が一気に“使えるスキル”として定着します。
「input()で対話化 → requestsでAPI操作 → JSON操作 → pandasで整形 → Excel出力 → 例外処理&ログ」の順がおすすめ。1ステップずつ自分の興味あるテーマで再現してみると、記事や書籍の知識が自分の手に馴染んでいくのを実感できます。
Web APIで取ったデータをpandasで整え、Excelとして書き出す——この一連のフローを身につけてしまえば、検索・調査・レポート作成の時間が劇的に短くなります💼 今回紹介したCiNii BooksのスクリプトはたったA4半分ほどのコード量ですが、応用範囲はとてつもなく広いんです。
まずは手元でinput("検索キーワード:")から動かしてみて、自分の興味あるテーマでExcelを生成する成功体験を積んでみてください🐣 そこから書籍やデバイス環境への投資を組み合わせれば、学習スピードはさらに加速します。今日紹介したアイテムが、あなたの“APIを操るチカラ”を磨く頼れる相棒になりますように!