Python でぐるなび API 使ってみた (解説編)

こんにちは、こんばんは、お疲れ様です。
最近 Python で、ぐるなびAPI を使って、ぐるなびに登録されている お店の情報を取得しました。

この記事では、Python を使ってぐるなび API を使う方法の解説をまとめます。
API がわからないという方は、以下の記事を参照すると概要を把握できると思います。

tetomu.hatenablog.com

Python を使ってぐるなび API を使う方法は、以下の記事にまとめています。

tetomu.hatenablog.com

今回の作業の環境は以下の通りです。

  • WSL (Ubuntu 16.04.4 LTS)
  • Python (Python 3.6.5 :: Anaconda custom (64-bit))
  • jupyter notebook  (4.4.0)

以下が目次です。

1. おさらい

ここでは、PythonぐるなびAPI を使う流れを簡単にまとめます。
1. API の URLにアクセスし、JSON形式のデータを取得します。
2. データの形式をJSON形式から、Python の辞書型に変換します。
3. 取得したい情報をよって、keyを指定し、値を取り出します。

2. 解説

最初に前回示した全コードを載せます。
まとまりごとに、解説をのせます。

# モジュールのインポート
import json
import urllib.request

# API に渡すパラメータの値の指定
url = "https://api.gnavi.co.jp/RestSearchAPI/v3/"
key = "******************************************" 

##### 上記の key は、ぐるなびAPI のアカウントを作成した際、取得したkeyidを指定
shop_name = "すし"

# API を使う関数の定義
def gnavi_api(shop_name):
    params = urllib.parse.urlencode({
        'keyid': key,
        'name' : shop_name,
    })
    response = urllib.request.urlopen(url + '?' + params)
    return response.read()

# 関数を使って、API から情報を取得
data = gnavi_api(shop_name)

# 取得した情報をJSON形式から辞書型に変換
read_data = json.loads(data)["rest"]

# お店の名前の一覧を格納する list の作成
list_name = []

# お店ごとにループを回し、お店の名前を list に追加する関数の定義 
def get_name(read_data):
    for dic in read_data:
        list_name.append(dic.get("name"))
    return list_name

# 関数を実行し、お店の名前の list を取得
get_name(read_data)

# 出力
['すし 魚游(うおゆう) 銀座店',
 'すし 魚游 (うおゆう)桜木町駅前店',
 '本格シュラスコ&肉すし食べ放題 肉ランド 蒲田店',
 '天然魚・寿司居酒屋 すしまる屋 東三国店',
 '築地すし一番 西浅草店',
 '仙石すし 本店',
 '浅草すし若 雷門店',
 '日本料理 すし哲 ',
 '築地すし鮮 銀座5丁目店',
 '浅草すし若 東陽町店']

2.1. モジュールのインポート

import json
import urllib.request

今回、使うモジュールをインポートします。
json は、JSON形式のデータを扱うために使用するモジュールです。
JSON(JavaScript Object Notation)は、ざっくりいうと、名前と値を持ったデータ形式です。(理解が正しくなかったすみません…)
以下から、JSONの公式ページ?にアクセスできます。
JSON

JSON形式は、現代のあらゆる言語で、変換可能なデータ形式となっています。
urllib.request は、URLを開くためのモジュールです。

2.2. API に渡すパラメータの値の指定

url = "https://api.gnavi.co.jp/RestSearchAPI/v3/"
key = "******************************************" 
shop_name = "すし"

API に渡すパラメータを指定します。
url には、今回使用するぐるなびAPI のアドレスを指定しています。
key は、ぐるなびAPI のアカウントを作成した際、取得したkeyidを指定します。
shop_name は、お店のなまえのパラメータです。
今回は、「すし」と指定することで、お店の名前に「すし」が含まれているデータを抽出します。

2.3 API から情報を取得する関数の定義

def gnavi_api(shop_name):
    params = urllib.parse.urlencode({
        'keyid': key,
        'name' : shop_name,
    })
    response = urllib.request.urlopen(url + '?' + params)
    return response.read()

この関数の引数は、shop_nameです。 以下は、params の出力です。

keyid=**************************&name=%E3%81%99%E3%81%97

urllib.parse.urlencode で、指定した(名前に「すし」が含む)条件のデータにアクセスするための URLの一部を作成しています。
name = の部分で、「すし」が含まれているデータを抽出するようにしています。

2.4 API から情報を取得とデータ形形式の変換

data = gnavi_api(shop_name)
read_data = json.loads(data)["rest"]

json.loads()で、データの形式を JSON から Python の辞書型に変換しています。
以下は、 json.loads(data)の出力の一部です。

{'@attributes': {'api_version': 'v3'},
 'total_hit_count': 2907,
 'hit_per_page': 10,
 'page_offset': 1,
 'rest': [{'@attributes': {'order': 0},
   'id': 'ga1u203',
   'update_date': '2018-12-06T11:09:39+09:00',
   'name': 'すし 魚游(うおゆう) 銀座店',
   'name_kana': 'スシウオユウ ギンザテン',
   'latitude': '35.672817',
......

お店の情報は、'rest' の値として格納されています。

2.5. お店の一覧の取得する関数の定義と取得

list_name = []

def get_name(read_data):
    for dic in read_data:
        list_name.append(dic.get("name"))
    return list_name

get_name(read_data)

# 出力
['すし 魚游(うおゆう) 銀座店',
 'すし 魚游 (うおゆう)桜木町駅前店',
 '本格シュラスコ&肉すし食べ放題 肉ランド 蒲田店',
 '天然魚・寿司居酒屋 すしまる屋 東三国店',
 '築地すし一番 西浅草店',
 '仙石すし 本店',
 '浅草すし若 雷門店',
 '日本料理 すし哲 ',
 '築地すし鮮 銀座5丁目店',
 '浅草すし若 東陽町店']

お店の情報は、辞書の list になって格納されています。
そのため、for 文で、お店ごとの情報(辞書)を取得し、 お店の名前を list_name に追加しています。

解説は以上です。
冗長になり、読みにくい部分もありますが、できるだけ丁寧にまとめていました。
間違っている理解などありましたら、指摘していただけるとありがたいです。

次回の記事の内容は、未定です。
内容の候補は、
1. Django(Python の WebFramework)
2. 僕が大学院にはいった理由と実際入ってみておもったこと
3. twitter bot の作成
等を考えています。

上記で書いてほしい内容などありましたら、コメントの記入お願いします。