楽天ブックスAPIで書籍検索してみた。

自分用に書籍管理アプリを作りたくて、書籍検索をするためにpython3から楽天ブックスAPIを使ってみた。

将来的にiOSアプリのPythonistaで使うことを考えて、pythonは3.5.1を使用した。
apiへのアクセスはrequestsライブラリを利用している。

楽天ブックスAPIを利用するためには、事前にアプリ情報の登録をしてアプリIDの発行が必要になる。
楽天の開発者向けページにアクセスし楽天アカウントに紐付いたアプリIDを発行してもらおう。

以上の準備が完了したら楽天ブックスAPIpythonから利用できる。
今回はisbnを利用して書籍検索をしてみよう。

#! /usr/bin/env python3
# coding: utf-8

import requests
import time

RAKUTEN_BOOKS_API_URL = "https://app.rakuten.co.jp/services/api/BooksBook/Search/20170404"
RAKUTEN_APP_ID = "YOUR_APP_ID_HERE"


def get_book_info_by_isbn(isbn):
  response = requests.get("{}?applicationId={}&isbn={}".format(RAKUTEN_BOOKS_API_URL, RAKUTEN_APP_ID, isbn))

  if response.status_code != requests.codes.ok:
    print("Requests failed")
  elif response.json()["count"] == 0:
    print("No book found: isbn {}".format(isbn))
  else:
    print("Book found: {}".format(response.json()["Items"][0]["Item"]))


if __name__ == '__main__':
  isbns = ['1111111111111', '2222222222222', ...]

  for isbn in isbns:
    get_book_info_by_isbn(isbn)
    time.sleep(1)

requestsのgetメソッドを利用して楽天ブックスAPIにアクセスする。
この時、事前に登録したアプリIDをapplicationIdとしてパラメータに設定して渡す必要がある。
また、検索条件もパラメータにするのだが、指定したいisbnはget_book_info_by_isbn()の引数として渡すようにしているので、これを利用している。

結果の検証については、まずはgetの結果が正常だったかどうかをresponseのstatus_codeが200かを調べている。
ここで問題なければAPIから何かしらの返答があったはずなので、これを確認する。

楽天ブックスAPIの結果はjson形式で戻ってくるので、jsonメソッドを使うことで辞書型の値として取り出すことができる。
この中にcountと言うキーが有り、これが検索結果件数を表している。
これが0だと指定したisbnでは書籍を見つけられなかったということなので、その旨を通知する。

検索した結果、書籍が見つかった場合にはItemsというキーに書籍情報が配列として保持されている。
書籍名などで検索していたときは複数見つかる場合もあるがisbnの場合には1つのみのはずなので、先頭の要素を取り出してそれが持つItemというキーの情報を取得する。
このItemというキーに書籍の情報が格納されているので、これを出力することで書籍情報を閲覧することができる。

今回の例では、複数のisbnを元にループを回して1冊ずつ書籍を検索することを想定して実装している。
このループの中で1秒間スリープさせているが、これは1秒間で1アクセス以上APIを利用してしまうと楽天API利用規約に違反するため。
最低でも1秒間は間隔を開けるようにする必要がある。

リクエストの結果の詳細については開発者ページに詳しく書かれているので、そちらを参考にすると良い。
今回初めて楽天APIを利用したが、ドキュメントもそれなりにあって利用者も多い印象なので、案外使いやすかった。
会員登録が少しめんどくさいが、書籍検索以外にも使えそうなので慣れておいて損はないように思う。