「レジスタとAPIは叩くもの」
現在独学中のDjangoの学習テーマとして、プロジェクトになにかしらのWEB APIを使う仕組みを取り入れようとしています。そして今回はWEB APIの候補として、ホットペッパーグルメのWEB APIを選びました。
ここではDjangoのバックエンド側、つまりviews.pyの中でWEB APIにアクセスすることを想定してPythonでホットペッパーグルメのWEB APIを使う方法について紹介します。
やりたいことのイメージ
さて、WEB APIを叩いてどんなことがやりたいのか。簡単にいうと「PythonのコードでWEB APIにアクセスして、APIから情報を取得する」ということです。
PythonのコードでWEB APIのルール(仕様)に則った形でAPIのURLにアクセスし、APIが返した情報をPython上でデータとして使えるように取得します。このときAPIから受け取る情報はjson形式にします。そして受け取ったjsonデータをPython上でデータとして扱えるように読み込みます。
使うもの
API Key
ホットペッパーグルメのAPIを使うためにはKeyが必要です。WEB APIを提供する「リクルート WEBサービス」にユーザー登録することで、ユーザーごとにKeyが与えられます。Keyは文字列データです。
(Keyはユーザー個人の責任で厳重に管理する必要があります。)
requests
PythonでWEB APIを叩くときに「requests」というPythonパッケージがよく使われます。
このパッケージはPythonのコードでHTTPリクエストを簡単に送信できるものです。つまり、何かしらのURLに対してPythonのコードでアクセスできます。
pip等のパッケージマネージャでインストールします。
$ python -m pip install requests
json
これはjsonデータになっている情報をPython上で扱えるようにするパッケージです。
Pythonに付属しているためインストール不要で使えます。
WEB APIの使い方
それでは実際にホットペッパーグルメのWEB APIにアクセスする方法をご紹介します。
APIのURL
ホットペッパーグルメのAPIのリファレンスを見ると、いくつかのAPIに分かれています。例えば具体的なお店の情報(店名やお店の画像等)を取得したい場合は「グルメサーチAPI」のURLを使います。以下にURLを示します。
http://webservice.recruit.co.jp/hotpepper/gourmet/v1/
このURLに対してAPIのルールに従ってGETリクエストをすると、お店の情報がレスポンスとして返ってきます。このときどんな情報が返ってくるのかというと、レスポンスフィールドにその一覧が書かれています。
APIにリクエストする時のルール
では、実際にURLにGETリクエスト方法についてご紹介します。APIに対してGETリクエストをするときのルールは「検索クエリ」の一覧表と「サンプルクエリ」に記載されています。検索クエリの一覧表に書かれた情報をURLに付け足してサンプルクエリの形式でGETリクエストすることになります。
検索クエリ一覧表を見るとkey(APIキー)の項目が必須であることと、その他のオプションの検索条件がたくさんあることがわかります。リファレンスに記載のサンプルでは以下のように「大エリアコード」を東京(Z011)としたときのURLが記載されています。先程のAPIのURLの後ろに「?」をおいて、その後に「<パラメータ>=<値>」という形でクエリを記載し、クエリを複数記載する場合は「&」を間に挟みます。(「key」には自分のAPIキーを記載します)
http://webservice.recruit.co.jp/hotpepper/gourmet/v1/?key=[APIキー]&large_area=Z011
このURLに対してGETリクエストすると、リクエストが正しく処理されればレスポンスフィールドに記載された情報がレスポンスとして返ってきます。
オプションのコードを得るためのAPI
先程のサンプルではオプションのクエリとして「大エリアコード」を東京(Z011)としたときのURLを記載しましたが、ではこのコードはどこから出てくるのでしょうか。これは他のAPIを使って知ることができます。
「大エリアマスタAPI」に対して先程と同様にルールに従ってGETリクエストを送ることで、大エリアコードがレスポンスとして返ってきます。その他中エリアや小エリアのコードもそれぞれのAPIを使って取得することができます。
Pythonのコード
それではいよいよPythonでWEB APIを叩くコードをご紹介します。
先程のグルメサーチAPIに対するサンプルクエリをPythonでリクエストします。
import requests
import json
# 自分のAPIキー
api_key = "(自分のAPIキー)"
# APIのGET先のURL
url = "http://webservice.recruit.co.jp/hotpepper/gourmet/v1/"
# APIにリクエストするクエリ
query = {
"key": api_key,
"large_area": "Z011", # 東京
"format": "json",
}
# HTTP リクエストを送る処理(GET)
responce = requests.get(url, query)
result = json.loads(responce.text)
print(json.dumps(result, ensure_ascii=False,indent=2))
- 最初にPythonでGETリクエストを送るための「requests」と「json」モジュールをインポートします。
- 変数api_keyに文字列としてAPIキーを代入します。
- 変数urlに文字列としてグルメサーチAPIのURLを代入します。
- 辞書型queryに、クエリのパラメータと値をそれぞれキーと値として保存します。この時、レスポンスをjsonとして欲しいため、「”format”: “json”」のクエリを追加しました。
- requests.getメソッドにurlとqueryを引数として渡して実行します。この時このメソッドはURLとクエリを自動的に結合してGETリクエストを送ってくれます。
- メソッドの戻り値を変数responceに代入します。この変数にレスポンスデータが入ります。
- json.loadsメソッドにresponceを「responce.text」として渡して実行します。「.text」とすることでレスポンスのボディ部分を文字列形式で取得します。json.loadsメソッドは文字列になっているjsonを辞書型として読み込みます。そして辞書型なったjsonデータを変数resultに代入します。
- 最後はjson.dumpsメソッドで辞書型を文字列にした上でインデントで整形して表示します。
このコードを保存してPythonで実行します。保存した結果の例を以下に示します。
{
"results": {
"api_version": "1.26",
"results_available": 28086,
"results_returned": "10",
"results_start": 1,
"shop": [
{
"access":(以下お店の情報)
.....
.....
.....
これでPythonを使ってホットペッパーグルメのWEB APIを叩いてレスポンスを受け取ることができました。
最後は辞書型として結果を表示していますが、その手前の変数resultは辞書型です。このため、お店の情報をPython上で扱うときは辞書型として例えば以下のようにアクセスできます。
result["results"]["shop"]
他の書き方
レスポンスをjsonとして読み込む処理の他の書き方も紹介します。
先程のコードでレスポンスデータのjsonを辞書型として取り込むときに以下のように記述しました。
result = json.loads(responce.text)
この1行はrequestsモジュールのjsonメソッドを使って以下のように書くこともできます。
result = responce.json()
このように書くと最後の表示処理(json.dumpsメソッド)でしかjsonモジュールを使わないため、表示処理をせずに辞書型の変数resultとしてデータを扱うまでの処理ならjsonモジュールをインポートしなくて済みます。
以上、ホットペッパーグルメのWEB APIをPythonで叩く方法についてご紹介しました。後々実際にDjangoに組み込んで使う様子もご紹介したいと思います。
コメント