学習内容

  • Pythonを利用した、Web APIの利用方法を学びます。
  • 環境構築も不要で、Googleアカウントがあれば簡単に実行できる、Google Colaboratoryを利用します。

受講における必須条件

  • Windows / MacなどのPCが利用できる方
  • Google Chromeをインストールできる方
  • クレジットカードを持っていること(APIの利用で使います。APIの使用料金はかかりません。)

講座内容

Web APIを、Pythonから利用して、画像収集を自動化します。

今回の内容としては

  • 総勢120人以上いるAKBメンバー一人ひとりに対して
  • 一人50件分の画像URLをWeb APIから取得
  • そのデータをCSVに保存

ということをやっていきたいと思います。

完成イメージは、こちらのユーザーの方のようになります。

学習内容としては

  • Pythonを利用したRequestsモジュールの使い方
  • Microsoft Bing Image Search APIの利用方法

について学びます。

このチュートリアルの特徴

このチュートリアルの特徴としては、以下のとおりです。

  • Google Colaboratoryを利用するので、Pythonの環境構築も一切必要なし
  • Web APIの利用方法に特化して、Python初心者でも専門用語をわかりやすく解説している

過去に技術書を購入して、Web APIを学ぼうとしたけれども、言っていることがよくわからなかった!という人にはとてもおススメです! Colaboratoryの利用方法についてはこちらにまとめてあります。

Google DriveでPythonの実行環境を整える方法をまとめてみた

 

このチュートリアルの対象

このチュートリアルの対象としては、以下の通りです。

  • PythonのWeb APIを学んでみたい人
  • Web APIを利用した画像のダウンロード方法を知りたい

また、対象者のレベル的には

  • ProgateでPython1-3くらいまでは理解している人(必須)
  • ProgateでCommand Lineのコースを理解している人(必須)
  • PythonのPandasの基礎を理解している人(できれば)

といったレベルになります。

このチュートリアルを読んでできるようになること

このチュートリアルで学べるのは、以下の通りです。

  • Web APIのリファレンスを自力で読んで、Bing Image Search APIを利用することができるようになる。
  • Web APIの理解が深まり、ほかのAPIも利用できるようになる

このチュートリアルをやる前の前提

このチュートリアルを始める前に、以下のことを確認しておいてください。

  • クレジットカードを持っていること(無料ですが、Bing Image Search APIを利用するうえで、クレジットカードを利用します)
  • ProgateでPython①~③までは試していて、基本的な関数の実装までの知識があること

Web APIとは

Web API(Application Programming Interface)について、勉強していきたいと思います。 Web APIを堅苦しい言葉で説明すると、

  • HTTPプロトコルを用いてネットワーク越しに呼び出すアプリケーション間、システム間のインターフェース

です。。。。。

こういうわかりにくい説明が嫌なのでもう少しわかりやすく説明していみます。

図にしてみるとこんな感じになります(※かなり簡素化しているので、もっと詳しく知りたかったらwiki等で見てください)

図1 Web APIの仕組み

 

 

Web APIは、とても簡単に言うと、外部サービスを通信によってデータのやりとりができる窓口です。

例えば、今回はツイッターのAPIを例に説明しましょう。 ツイッターは、普通Webブラウザ、もしくはスマホアプリ経由でアクセスして、以下の行動をとることができると思います。

  • ツイートの作成
  • ツイートの削除
  • プロフィールの更新
  • ほかの人のツイートのいいね

ただし、例えばツイートの作成をするためには、

  • ツイッターのアプリにログインする
  • ツイッター投稿画面に移動する
  • ツイッター投稿画面に入力する
  • ツイッター投稿画面から、送信をクリックする

といった動作がWebブラウザを通して、手動でいちいちポチポチしていく必要がありますよね。

これらの動作を、HTTPという通信方式を利用して、データの窓口に「投稿しろ!」と命令として送ると、一発で自動でやってくれるのですが、その窓口がWeb APIとなります。 僕らがネットからサイトでデータにアクセスするとき、投稿するとき、更新するとき、削除するとき、僕らはHTTPという通信を使っています。

そして、そのデータをほかのサイトから扱うときの窓口をしてくれているのがWeb APIなのです。

例えばこちらからPythonを実行して、あるアプリケーション(今回の場合はツイッター)に向けて命令の通信を送信すると、ツイッターの情報の受信・送信・更新・消去ができるような窓口Web APIから、ツイッター内部のデータを編集したり作成したりすることができるのです。 Web APIは共通の方式で外部のデータを公式に取得したり、投稿できたりできるので、外部サイトの情報をうまく利用する方法として、適しています。

Web APIのメリット

Web APIを使うメリットとしては、

  1. アプリケーションとアプリケーションを通信によってつなげることができるようになるので、多機能はアプリケーションを作れる
  2. 人間が手動で行うと、大変な繰り返しも、HTTPの通信によって自動取得が容易になる

といった点があります。 ①に関しては、例えばPeingなどのアプリケーションでは、ツイッター上で質問に対して回答ができるようになっています。

 

 

あれはツイッターのAPIを利用して、外部アプリケーションから回答用の質問をAPI経由で送信して、ツイッター上で投稿できるようにしているのです。 ほかにも、例えば「あるユーザーの過去100件のツイートをCSVにエクスポートしたい」といった場合、手動でやるのはとても大変ですよね。これをWeb APIを経由してやると、数秒で簡単にダウンロードできてしまうわけです。

Web APIを利用するにあたって覚える知識

それでは、さっそくWeb APIを学ぶ上で必要な知識を学びましょう。

HTTP(Hypertext Transfer Protocol)

HTTPは、難しくいうと、

HTMLなどのコンテンツの送受信に用いられる通信プロトコルである。主としてWorld Wide Webにおいて、WebブラウザとWebサーバとの間での転送に用いられる。日本標準仕様書ではハイパテキスト転送プロトコルとも呼ばれる。(wiki https://ja.wikipedia.org/wiki/Hypertext_Transfer_Protocol)

らしいです。。。。。

でもまぁよくわからんって感じなので、ただのインターネットの通信の一つだと思ってください。 さて、さっそくAPIを使うために、HTTPの通信について学びたいと思います。ここでは、以下の4種類を学んでいきましょう。

  • CRUD
  • URL (エンドポイント・リクエストURL)
  • リクエストヘッダーと認証
  • リクエスト ボディ

CRUD (CREATE READ UPDATE DELETE)

まず、CRUDです。CRUDはCreate, Read, Update, Deleteの略称です。実は、僕らがネットで通信しているときって、実際以下の4つの処理しかしていないんですよね。左が具体的な操作、右が実際にHTTPで通信するときの言葉です。

  • CREATE: 作成 ⇒ POST :ツイートの投稿、新規アカウントの作成等
  • READ:読み取り ⇒ GET :ツイートの閲覧、プロフィールの閲覧等
  • UPDATE:更新 ⇒ PUT :プロフィールの更新等
  • DELETE:削除 ⇒ DELETE :ツイートの削除等

CREATEは、その名の通り、作成です。

例えば、ツイッターで投稿する場合は、投稿を送信することになりますので、HTTPでCREATEアクションを行います。

CREATEアクションは、HTTPだとPOSTというアクションを行うわけです。CREATE = POSTだと覚えてもらって、大丈夫だと思います。

READは、その他の通り読み取りです。例えば、「〇〇さんのツイートを取得したい」ってときはそのURLにREADアクションを行います。READアクションはHTTPだと、GETリクエストを送ることになります。

何かしらの情報を送るのではなく、単純に見たいのであれば、GETというリクエストを送ることになります。

UPDATEは、その名の通り、更新です。例えば、「すでに書いてある自分のプロフィールを更新したい」という場合、更新することになります。その場合は、UPDATEアクションになります。HTTPの通信だと、PUTというリクエストを送ることになります。

DELETEはその名の通り消去です。例えば、「昨日投稿したツイートを削除したい」という場合、ツイートに対してDELETEアクションを実行します。そういうときは、HTTPでDELETEというリクエストを送ることになります。

Web APIを利用するときは、この4種類のリクエストを送ることで、情報を取得したり、投稿したり、更新したり、削除したりすることができるわけです。

URL (エンドポイント・リクエストURL)

Web APIからデータを受信したり、送信したりする部分のURLです。エンドポイントとも呼ばれます。

リクエストヘッダーと認証

次に、リクエストヘッダーです。

さて、あなたがツイッターにログインするとします。。その時に、あなたがあなたである証明できるコードを、実は常に通信の一部の中に埋め込んでいるわけです。

HTTPには実はHTTPヘッダーという部分と、HTTPボディという二つの部分に大きく分かれています。

この、リクエストヘッダーの部分に、あなたがあなたであるという認証の暗号が埋め込まれているわけですね。

ちなみにこの認証の暗号がないと、例えばあなたのツイッターのアカウントに、悪意のあるユーザーが勝手にログインして、勝手にツイートを削除したり、勝手にツイートしてしまうことが可能になってしまします。

そうなってしまうと困るので通信の中には自分の認証コードをHTTP ヘッダーに含める必要があるわけです。

あとHTTP Headerには、今ログインしようとしているのがパソコンなのか、スマホなのかという情報も実は埋め込んだりしています。

どのサイトにアクセスするかによって、リクエスト の中身はかわります。

また、HTTPのリクエストの中身を、実際にブラウザ上から見ることも可能です。詳しい情報は、WindowsならF12ボタンを押して、開発者ツールを開くと、どんな通信を行っているかわかるかと思います。 今回は、APIキーという値をリクエストヘッダーに入れて、認証を行うことになります。

リクエスト ボディ

リクエストメッセージボディには、さきほどログインするときに入れたような情報を埋め込むことができます。名前とか、パスワードとかそういう値ですね。情報を送る場合なので、POSTリクエストを送るときが一番使われます。 今回だと

  • 翻訳するキーワードの文字列
  • 何個分の画像を取得するかの値

となります。

Microsoftアカウントの投稿

さっそく、準備をはじめましょう。 まず最初に、Microsoftアカウントを発行しましょう。以下のURLにアクセスしてください。

Microsoft Azureに登録

今度は、APIを利用できるMicrosoft Azureに登録します。一応、こちらのQiitaを見れば登録方法はだいたいわかると思いますので、ご確認ください。 以下のURLをクリックしてください。

次に、画面右上の「無料アカウント」を選択します。

無料ではじめるをクリックします。

Azureサインアップページに入りますので、既存のマイクロソフトアカウントを選択して、ログインします。

Azureの無料アカウントサインアップページに行くと思うので、以下の情報を入力します。

  • 国/地域
  • 電子メールアドレス
  • 電話
  • 名の読み方
  • 姓の読み方

その後、電話に、電話番号による認証があるので、そちらを認証します。 最後に、カードによる本人確認が必要となります。 ※ただし、プランをアップグレードしない限り、請求されないので安心してください。

サブスクリプション契約に同意しますにチェックします。 最後にサインアップをおしてください。

Bing Image Search APIのAPIキーの取得

次に、Bing Image Search APIのAPIキーを取得しましょう。下記URLからアクセスします。

Bing Image Search API

以下のようなホームページが見れると思います。

こちらの、 ≫Bing Web Searchを試す をクリックすると、以下のような画面になると思います。

ゲストの7日間の試用期間の

  • ≫はじめる

をクリックします。

Microsoft Congnitive Services使用条件画面がでるので、チェックボタンとリージョンを日本に選択し、≫同意するにチェックをいれて≫次へをクリックします。

次にログインするアカウントを選択します。マイクロソフトのアカウントが存在する場合は、マイクロソフトアカウントを選択します。(今回のチュートリアルはマイクロソフトアカウントのみで検証します。)

その後、ログイン画面が出てくると思いますので、アカウントを選択して、パスワードを入力し、ログインしてください。 ログイン後、以下のURLにアクセスしてください。

Bing Search API v7がアクティブになると、以下のようなページにアクセスできると思います。

こちらの、キー1がAPIキーとなります。 のちほど使いますので、メモしておきましょう!

APIドキュメントを読む

さて、APIキーを取得できました。このAPIキーは、APIを使うためのパスワードになります。さっそく、このパスワードが利用できるようになったので、APIドキュメントを見つつ、実装していきましょう。

ちなみに全部英語なので、もし英語が苦手な人は日本語に変換しながら読んでみましょう。

概要

まずは概要を見てみましょう。 翻訳したものが、こちらになります。

Image Search APIを使用すると、Bingに検索クエリを送信して関連するイメージのリストを取得できます。このセクションでは、イメージを要求するために使用するクエリパラメータとヘッダー、およびそれらを含むJSON応答オブジェクトに関する技術的な詳細を提供します。リクエストの作成方法の例については、「Webでのイメージの検索」を参照してください。

要求に含める必要のあるヘッダーについては、「ヘッダーの要求」を参照してください。 要求に含める必要があるクエリパラメータの詳細については、「クエリパラメータ」を参照してください。 応答に含まれるJSON応答オブジェクトの詳細については、「応答オブジェクト」を参照してください。 使用の許可と結果の表示については、「Bing Search APIの使用と表示の要件」を参照してください。

エンドポイント

リファレンスを見ると、3種類のエンドポイントがあります。

  • https://api.cognitive.microsoft.com/bing/v7.0/images/search ユーザーの検索クエリに関連するイメージを返します
  • https://api.cognitive.microsoft.com/bing/v7.0/images/details イメージを含むウェブページなど、イメージに関するインサイトを返します。
  • https://api.cognitive.microsoft.com/bing/v7.0/images/trending 他人の検索リクエストに基づいて動向を把握している画像を返します。画像は異なるカテゴリに分類されます。たとえば、人気のある人物の検索。

今回は、検索結果から画像を取得するものなので、以下のエンドポイントを指定しましょう。 https://api.cognitive.microsoft.com/bing/v7.0/images/search

Headers

ヘッダーの中身を確認します。基本的にはAPIの各値の見方について説明すると

  • required(必須):必ずヘッダーに含めなければいけない値
  • optional(任意):状況に応じて含めるべき値

となります。ですので、required(必須)のパラメーターから見ていきましょう。 requiredのパラメーター

  • Ocp-Apim-Subscription-Key:Cognitive Servicesでこのサービスにサインアップしたときに受け取ったサブスクリプションキー。

こちらは先ほど取得したAPIキーとなります。

Query parameters

そのまま日本語に翻訳します。

リクエストに含まれるクエリパラメータは次のとおりです。必要なパラメータについては、「必須」欄を参照してください。クエリパラメータ値をURLエンコードする必要があります。 Bingが返すイメージをフィルタリングするために使用するクエリパラメータについては、「クエリパラメータのフィルタリング」を参照してください。

  ということで、様々なパラメータがあるかと思います。で、今回使う分だけのパラメーターを解説しますね。テーブル右上のものがRequiredになっているので、そこを優先的に、そしてcountで必要な値を取得します。

  • q(必須): ユーザーの検索クエリ用語。この用語は空ではありません。
  • count(任意): レスポンスで返されるイメージの数。配信される実際の数は、要求された数より少なくてもよい。デフォルトは35です。最大値は150です。

ここまで理解ができれば大丈夫です。早速実装していきましょう。環境は、Google Colaboratoryからできますので、そちらから試していきましょう。

今回やりたいことの確認

今回でやりたいことの確認です。

  • AKBメンバー120名の名前一人ひとりに対して、画像100枚をダウンロードして、それをCSVに保存する

というような流れで進めていきます。

モジュールのインポート

今回使うのは、以下のモジュールです。

  • Requests: HTTPの通信を行うことができるPythonモジュール
  • Pandas: 取得したデータをCSVに出力することができるモジュール

さっそく、importしてみましょう。

import requests
import pandas as pd

APIキーの指定

次に、Microsoft Azureから取得したAPIキーを指定します。
import requests
import pandas as pd

API_KEY = "$ここに取得したAPIキーを追加" # APIキーを追加

APIのエンドポイントの追加

今度は、APIを実行するURLを指定してあげます。
import requests
import pandas as pd

API_KEY = "$ここに取得したAPIキーを追加" 
URL = "https://api.cognitive.microsoft.com/bing/v7.0/images/search" #APIのエンドポイントの追加

送信するHTTPヘッダーを指定

次に、送信するHTTPヘッダーを指定します。 HTTPヘッダーについては、さきほどリファレンスを見ると、以下のようになりました。
  • ・Ocp-Apim-Subscription-Key:Cognitive Servicesでこのサービスにサインアップしたときに受け取ったサブスクリプションキー。
こちらを、requestsモジュールでHTTPの通信で送れるように設定します。
import requests
import pandas as pd

API_KEY = "$ここに取得したAPIキーを追加" 
URL = "https://api.cognitive.microsoft.com/bing/v7.0/images/search" 
headers = {"Ocp-Apim-Subscription-Key" : API_KEY} # HTTP Headerの設定

取得上限数を指定

次に画像の取得数を指定します。
import requests
import pandas as pd

API_KEY = "$ここに取得したAPIキーを追加" 
URL = "https://api.cognitive.microsoft.com/bing/v7.0/images/search" 
headers = {"Ocp-Apim-Subscription-Key" : API_KEY} 
MAX_RESULTS = 100 #取得する画像の最大値

検索キーワードを指定

次に、取得したい画像の検索キーワードを追加します。