[python]Google Books APIsを使って書籍検索をする

プログラミング
この記事は約7分で読めます。

いきなりのpythonです。

実は最近Djangoをちょっとかじっていて、一通り勉強したのでなにか作ってみようと思ったので書籍管理のWEBアプリの作成なんかしています。

そこで書籍情報を全部自分で入力するのではなくどっかのDBから拾ってこれないかなと思って、書籍検索APIをいろいろ試してみていたんです。

この記事では、GoogleBooksAPIsを使ってキーワード検索した結果をjsonで取得する方法について述べます。

なぜGoogleBooksAPIsなのか?

一にも二にも書影がほしい、目立つし

一言で言ってしまえば書影がほしかったからです。

ほんとそれだけです。最初は国立国会図書館のAPIを使おうと思ったんです。なにせ国立だし、DBの巨大さで行ったら絶対にこっちなわけですよ。でも書影を撮ってくることができなかったんです。

書影が絶対にいるか?って言われたらたしかに微妙ですが、やはり画像があるだけで見栄えは良くなりますからね。一応jpndlpyの使い方もわかったし、また困った時に変更しようってことにしました。

というかamazonAPIにしたら?

これに関しては2019年1月時点で、アマゾン・アソシエイトの収益が上がっていない場合はリクエストを送っても503が帰ってくるらしいです。ちなみに僕の収益はゼロです。そりゃ何回叩いても帰ってくるわけ無いわな。悲しい。

データの豊富さやイメージ画像があることを考えても、amazonAPIのほうが使い勝手は良さそうなので、収益が上がったらいずれ変更したい。

GoogleBooksAPIsの使い方

Djangoに組み込んだソースの抜粋で失礼します。とりあえず雑感は掴んでもらえると思うんで……。

import requests
import json

url = 'https://www.googleapis.com/books/v1/volumes?q=intitle:'

def book_search(request):
    """書籍の検索画面"""
    searchform = SerchForm(request.GET)
    if  searchform.is_valid():
        keyword = searchform.cleaned_data['keyword']
        #keywordとurlを連結する
        req_url = url + keyword
        #リクエストを投げる
        response = requests.get(req_url)
        #レスポンスをストリング?に変えて、jsonとしてロードする。
        #そしてitems要素(本のcollectionになるのかな?)としてhtmlにわたす。
        items = json.loads(response.text)['items']
        context = {
            'searchform' : searchform,
            'items' : items,
        }
    else:
        context = {
        'searchform' : searchform,
        }
        searchform = SerchForm()
    return render(request,'cms/book_search.html',context)

まず関数の外で宣言しているurl変数がGoogleのAPIです。q=の後に検索条件を指定します。この場合では「intitle:」でタイトルに対するキーワード検索を行うようにしていますね。

keywordに検索フォームに入力した検索したいキーワードが入っているので、urlに連結して検索リクエストを作成します。そしてrequestsに投げて返ってきたresopnseのtext要素をjsonとしてロードします。

最初はresponse.textをprint()したらjsonっぽい返り値が来たのでもうjsonになっているもんだと思ったんですけど、どうもちゃんとjsonとして読み込まないとだめみたいです。

最終的にitemsには検索結果の情報が辞書型で入っているので、ここから適宜好きなように値を取り出してやれば検索結果一覧が手に入ります。

自分の場合はitemsをそのままhtmlに渡しちゃって、そっちで処理していますね。

参考までにソースは貼っておきます。

    {% if items %}
        <table class="table" style="table-layout:fixed;width:100%;">
            <tbody>
                <thead>
                    <div class="row">
                        <tr>
                            <th width="15%"></th>
                            <th width="35%">タイトル</th>
                            <th width="30%">著者</th>
                            <th width="20%">操作</th>
                        </tr>
                    </div>
                </thead>
                {% for item in items%}
                    <tr>
                        <td>
                            <img src = "{{item.volumeInfo.imageLinks.thumbnail}}"></img>
                        </td>
                        <td>
                            {{item.volumeInfo.title}}
                        </td>
                        <td>
                            {% for author in item.volumeInfo.authors %}
                                {{author}},
                            {% endfor %}
                        </td>
                        <td>
                            <a href="{% url 'cms:book_list'%}" class="btn btn-primary btn-sm">追加</a>
                            <a href="{{ item.link }}" class="btn btn-primary btn-sm">リンク</a>                           
                        </td>
                    </tr>
                {% endfor %}
            </tbody>
        </table>
    {% endif %}

参考文献

【Python3】Google Books APIを使ってみる

Google Books API からJSONデータを取得してjQueryで処理する

JSONパースのTypeError: string indices must be integersでハマった

コメント

タイトルとURLをコピーしました