Pythonで検索してみよう ~Google Books APIを使ってみる ep1~

python
python

APIって調べても良く分からない・・・

とにかく使ってみようぜ!

「API」をご存じでしょうか?

プログラミングをやっている方は、「当たり前!!」って方も多いと思います。
一方で、プログラミングに縁のない方や初学者は、まず聞いたことない言葉だと思います。
もちろん、私もほんの少し前まで聞いたことありませんでした。

私はWebスクレイピング(=Web上の情報を解析して収集、まとめるプログラム)の学習中に出てきて、なんとなく分かったけども、実態が分からないヤツでした。

ざっくりいうと、

APIとは、「Webサイトに問い合わせて、欲しい情報をGetできるしくみ、サービス」

という感じです。

まだピンと来てないので、とにかくやってみます。
(2021年4月30日:学習開始70日目 PyQさんで勉強中!

オンラインPython学習サービス「PyQ™(パイキュー)」


さて、APIときいて思い出すのは、APC = A Perfect Circleです。
Toolってバンド(こっちも最高)のボーカルのかけもちバンドで、暗く、熱く、美しくというイメージです。
今回は、その中でも美しい成分多めの「So Long, And Thanks For All The Fish」を聞きながらやっていきます。
ちなみに、暗め成分多めなら、Beatlesの暗黒カバー「Imagine」も最高!
(どっちも曲名から公式YouTubeに飛びます。)

So Long, And Thanks For All The Fish」はこっち

Imagine」はこっち

では、「API」、やっていきましょう。

1.「API」とは何か?

「API」とは、「アプリケーション プログラミング インタフェース」だそうです。
はい、忘れましょう。

広義では、いろいろと意味を持つようですが、ここでは、
「プログラム上で問い合わせると、答えが返ってくるサービス」
程度の理解で良いと思います。

この「サービス」の部分ですが、Google、Amazon、楽天をはじめ、大手のサイトから個人サイトまでいろいろなサイトが「API」を発行しており、有償や無償で使えるという意味です。
この「外部サイトの発行しているシステムを使う。」というのがポイントの一つです。

では、「WEBページスクレイピング」と「WEB APIの利用」は何が違うのでしょうか?
(WEB APIもWEBページのスクレイピングの1種かもしれませんが・・・流しましょう。)

WEBページのスクレイピングは、公開されたWEBページの情報を解析して、データを収集します。

一方で、WEB APIの利用では、WEBページそのものを解析せずに、外部に問い合わせをしてデータを返してもらいます。

スクレイピングは違法行為ではありませんが、「勝手に」WEBページを解析して情報を収集します。
大量にアクセスをすると、そのサイトのサーバーに負荷をかけてしまいます。
そのため、WEBサイトによっては利用規約で禁じているページもすくなくありません。
(例えば、Amazon、Twitterをはじめ多くのサイトで禁じています。)
【※絶対に自動化してはいけない】自動化禁止サイトまとめ!

一方、APIは、基本的にデータを持っている会社や個人が発行しているものです。
APIの利用規約や制限はありますが、「使っていいよ!」というサービスです。
スクレイピングを禁止しているAmazonやTwitterですが、それぞれAPIは発行しています。
(ただし、どうやら勝手にほかのページのデータを取りに行く「野良API」もあるようです。注意が必要です。

上の説明は、かーなり雑なものです。
実際は、APIを使って認証できたり(GoogleじゃないサイトなのにGoogleアカウントで入れるヤツ)、もっといろいろできるようです。

世の中に無数にあるAPIのうち、今回は「Google Books API」を使ってみます。

2.やりたいこと

Pythonの最新本を調べるには、どうすれば良いでしょうか?
私なら、
①:Amazonにアクセスする
②:「Python」で検索
③:「出版年月が新しい順番」に並び替える
というふうにします。べたですね。

実際にやってみるとどうなるでしょうか?
見事に洋書が並びます。そう、「Python」の本は圧倒的に洋書が多いのです。
これを日本語の本だけを抽出して、新しい順に並べるのは多分やり方はあるのでしょうが、地味~にやり方が分かりません。

そこで
「APIを使って日本語のPython本の新刊情報を取得する」
という事をやってみたいと思います。

今回はAmazonも楽天もAPIはありますが、今回は「Google Books API」を使用してみます。
Google Books APIs公式ページ
公式にも記載がありますが、検索だけな認証キーなしで使えます。
また、こちらのページGoogle Books APIの使い方~その4~も参考にさせていただきました。

では、早速やってみましょう。(今回は1冊検索のみです。新刊情報取得は次回!)

3.下準備(RequestsとPandasのインポート)

進める前に、下準備を行います。
今回は、標準外のライブラリとして、RequestライブラリとPandasiライブラリを使います。

インポートの仕方は、過去記事Pandasでグラフに針を落とす ~ビュフォンの針を落とす ep4~参照。

まあ、簡単なので、手順は以下です。(Windowsの場合)
①:コマンドプロンプトを開く
②:以下のコマンドをそれぞれ入力して実行

C:\Users\XXXXX>pip install requests
C:\Users\XXXXX>pip install pandas


終わりです。
Pandasは別に必須ではありませんが、最後にデータをまとめるときに使おうと思います。

4.APIを使ってみよう ~1件検索してみる~

まずは欲張らずに1件のみ検索してみようと思います。
Python2年生 スクレイピングのしくみ」を検索してみようと思います。
本書は、今回の検証をするのに大いに参考にしています。(なおGoogle Books APIはやってません)

さて、まずはやってみましょう。
Google Books APIs公式ページをよく読んでいく必要があります。全編英語!頑張りましょう。

だーっと読んでいくと、
「https://www.googleapis.com/books/v1/volumes?q=search+terms」
と検索の例があります。
ここの「q」のところに検索の内容を入れればよいようです。

今回は、ISBN、書籍に割り当てられた識別番号を使用して検索をかけてみます。
手元に本書があるので、ISBNはすぐに分かります。9784798161914です。
公知情報なので、調べればすぐに出てきます。

公式ページを読んでいくと、ISBNで検索する場合は、
「q=isbn:(番号)」と入れればよいようです。
早速やってみましょう。
RequestsライブラリでURLにアクセスして情報を取得します。

import requests

url = 'https://www.googleapis.com/books/v1/volumes?q=isbn:9784798161914' #GooglBooksAPI
response = requests.get(url) #情報の取得
print(response)

結果はこのように出力されます。

<Response [200]>

ダメな感じしますね。
調べると、形式の問題のようです。
Google Books APIに限らず、多くのAPIではJSONという形式でデータが返ってくるようです。
これはJavaScript のデータ形式だそうで、そのまま扱えません。
修正しましょう。

JSON形式のデータをPythonで読めるように変化する必要があります。
Pythonにはその名も「JSON」というライブラリがあり、これで解決できます。
たった5行!!

import requests
import json

url = 'https://www.googleapis.com/books/v1/volumes?q=isbn:9784798161914' #GooglBooksAPI
response = requests.get(url).json() #情報の取得,json変換
print(response)

出力結果はこうなります。
(実際は、入力したURLをブラウザで開いたものです。あとIDとかetagってのは消しました、なんとなく。)


  "kind": "books#volumes",
  "totalItems": 1,
  "items": [
    {
      "kind": "books#volume",
      "id": "7EmwDwAAQBAJ",
      "etag": "+DHf0yjkSyI",
      "selfLink": "https://www.googleapis.com/books/v1/volumes/XXXXXXXXX",
      "volumeInfo": {
        "title": "Python2年生 スクレイピングのしくみ 体験してわかる!会話でまなべる!",
        "authors": [
          "森巧尚"
        ],
        "publisher": "翔泳社",
        "publishedDate": "2019-10-04",
        "description": "Pythonでスクレイピングを体験してみよう! ~~~~~略~~~~~
          {
            "type": "ISBN_13",
            "identifier": "9784798161914"
          },
          {
            "type": "ISBN_10",
            "identifier": "4798161918"
          }
        ],
        "readingModes": {
          "text": false,
          "image": true
        },
        "pageCount": 192,
        "printType": "BOOK",
        "maturityRating": "NOT_MATURE",
        "allowAnonLogging": false,
        "contentVersion": "0.13.0.0.preview.1",
        "panelizationSummary": {
          "containsEpubBubbles": false,
          "containsImageBubbles": false
        },
        "imageLinks": {
          "smallThumbnail": "http://books.google.com/books~~~~~略~~~~~"
          "thumbnail": "http://books.google.com/books/~~~~~略~~~~~"
        },
        "language": "ja",
        "previewLink": "http://books.google.co.jp/~~~~~略~~~~~",
        "infoLink": "http://books.google.co.jp/~~~~~略~~~~~",
        "canonicalVolumeLink": "https://books.google.com/books/about/~~~~~略~~~~~"
      },
      "saleInfo": {
        "country": "JP",
        "saleability": "NOT_FOR_SALE",
        "isEbook": false
      },
      "accessInfo": {
        "country": "JP",
        "viewability": "PARTIAL",
        "embeddable": true,
        "publicDomain": false,
        "textToSpeechPermission": "ALLOWED",
        "epub": {
          "isAvailable": false
        },
        "pdf": {
          "isAvailable": false
        },
        "webReaderLink": "http://play.google.com/books/~~~~~略~~~~~,
        "accessViewStatus": "SAMPLE",
        "quoteSharingAllowed": false
      },
      "searchInfo": {
        "textSnippet": "Pythonでスクレイピングを体験してみよう! 【スクレイピングとは】 ~~~~~略~~~~~"
      }
    }
  ]
}

1件でも非常に長いデータが返ってきました。
データを見ると、「Python2年生 スクレイピングのしくみ」が返ってきていることが分かります。
まずは成功です!!!

今回、APIにISBNのデータを入力することで、結果が返ってきています。
既存のWEBページをスクレイピングしているわけではないというのが、今回のポイントの一つです。

さて、もう少しデータを詳しく見てみましょう。
まず分かるのは「辞書型データである」という事です。全体が{}で囲まれていますね。
という事は個別のデータを抽出するには、辞書型データとしてデータを取り出せば良さそうです。

データ件数は、「’totalItems’: 1」と表現されています。
さらに基本情報は
「{‘itemes’:[{‘kind’:~~~~, ‘volumeInfo’:{’title’:~~~}」という形で
「辞書型データ」の中の「リスト型データ」の中の「辞書型データ」の中の「辞書型データ」という4つの入れ子にデータがあるという構造を取っていることが分かります。
ややこしいですね~。しかし一つずつ紐解けば大丈夫そうです。

まずは、件数とタイトルを取り出してみましょう。

import requests
import json

url = 'https://www.googleapis.com/books/v1/volumes?q=isbn:9784798161914' #GooglBooksAPI
response = requests.get(url).json() #情報の取得,json変換
totalitems = response['totalItems'] #件数
items_list = response['items'] #items リストデータ
items = items_list[0] #items
info = items['volumeInfo']
title = info['title']

print('件数:', totalitems)
print('タイトル:', title)

出力はこうです。

件数: 1
タイトル: Python2年生 スクレイピングのしくみ 体験してわかる!会話でまなべる!

できましたね!!!

では、最終的にアウトプットしたいモノを全部出力してみましょう。
最終的にアウトプットしたいのは、欲張って、
①:タイトル(済)
②:著者
③:出版社
④:出版日
⑤:ページ数
⑥:書籍種別
⑦:言語
⑧:要約、説明

とします。

import requests
~~~~~略~~~~~~
items = items_list[0] #items
info = items['volumeInfo']
title = info['title']
author = info['authors']
publisher = info['publisher']
publisheddate = info['publishedDate']
pages = info['pageCount']
printtype = info['printType']
description = info['description'] #要約
language = info['language']
print('件数:', totalitems)
print('タイトル:', title)
print('著者:', author)
print('出版社:', publisher)
print('出版日:', publisheddate)
print('ページ数:', pages)
print('種別:', printtype)
print('言語:', language)
print('要約:', description)

出力結果です。

件数: 1
タイトル: Python2年生 スクレイピングのしくみ 体験してわかる!会話でまなべる!
著者: ['森巧尚']
出版社: 翔泳社
出版日: 2019-10-04
ページ数: 192
種別: BOOK
言語: ja
約: Pythonでスクレイピングを体験してみよう! 【スクレイピングとは】~~~~略~~~~~


うまくできましたね。準備はここまでです。
しかし、今回はここまでとします。

次回、PythonでPythonの最新本を探していきましょう。

To Be Continued :Google Books APIを使ってみる ep2

PyQさんで勉強中!

コメント

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