python3で、ぐるなびAPIを叩いてみる

よくあるあれです。
リストと辞書が、複雑にネスト？ごっちゃになったやつから、希望するデータだけを抜き出したいですね。
そこらへんの構文の復習も踏まえてやっていきます。

# 1.APIを取得する
まずは、API keyを取得しなければなりません。
https://api.gnavi.co.jp/api/
こちらから新規アカウントを作成して、キーを取得してください。

# 2.辞書型の復習
辞書型の復習をしておきます。

```grnb01.py

meibo = {"tarou": {"age": 30, "live": "tokyo"},
         "hanako": {"age": 25, "live": "kanagawa"},
         "kenta": {"age": 27, "live": "tokyo"},
         "miyo": {"age": 22, "live": "chiba"},
         }

print(meibo)
# {'tarou': {'age': 30, 'live': 'tokyo'}, 'hanako': {'age': 25, 'live': 'kanagawa'}, 'kenta': {'age': 27, 'live': 'tokyo'}, 'miyo': {'age': 22, 'live': 'chiba'}}

print(meibo.keys())
# dict_keys(['tarou', 'hanako', 'kenta', 'miyo'])

print(meibo.values())
# dict_values([{'age': 30, 'live': 'tokyo'}, {'age': 25, 'live': 'kanagawa'}, {'age': 27, 'live': 'tokyo'}, {'age': 22, 'live': 'chiba'}])

print(meibo.items())
# dict_items([('tarou', {'age': 30, 'live': 'tokyo'}), ('hanako', {'age': 25, 'live': 'kanagawa'}), ('kenta', {'age': 27, 'live': 'tokyo'}), ('miyo', {'age': 22, 'live': 'chiba'})])

print(meibo["tarou"])
# {'age': 30, 'live': 'tokyo'}

print(meibo["tarou"]["age"])
# 30

print("―――――――――――――――――――")
# 全ての"ageだけを取り出したい！"
for i in meibo.keys():
    print(meibo[i]["age"])
```

上から順番に見ていってください。
dict1{ hoge: {key1: value1, key2: value2}, huga{key1: value1, key2: value2}}という形になっています。
もし、hugaの中のvalue2を取り出したかったら、
`dict[huga][key2]`という風にして取り出します。
中がリストの場合は、[0]や[1]といった、リストの番号を指定します。

# 3.ネストされた辞書
辞書の中に辞書がある形は#2でやりましたが、辞書の中にリストがあったり…その中に辞書があったり…
複雑な形はどうしたら良いでしょうか？

```grnb02.py

meibo = {"tarou": {"age": 30, "live": "tokyo"},
         "hanako": {"age": 25, "live": "kanagawa"},
         "kenta": {"age": 27, "live": "tokyo"},
         "miyo": {"age": 22, "live": "chiba"},
         "rest": [{"id": "abcde", "date": "181119", "fullname": "tanakajirou"}],
         }

print("―――――――――――――――――――")

print(meibo["rest"][0]["id"])
# abcde
```

辞書の中のrestの中にリストがあって、そのリストの中にまた辞書がある複雑な図です。
idを取り出したい場合はどのようにしましょう？
`meibo["rest"][0]["id"]`このように、リストの番号を入れることで無事に取り出すことができます。


# 3.ぐるなびAPIの形式を確認する
ぐるなびのAPIが、辞書の中にリストがある…そのような複雑な形になっています。
<img width="973" alt="スクリーンショット 2018-11-19 15.15.29.png" src="https://qiita-image-store.s3.amazonaws.com/0/192887/8a19e180-ccd3-4993-1663-3dcb7b42eded.png">
https://api.gnavi.co.jp/api/tools/?apitype=RestSearchAPI
こちらのテストツールで、`name=花見鮨`
と入れた時の結果です。（目黒の美味しいお寿司屋さんですので、是非に）

この中の、address（住所）を取りたい時はどうしたらよいでしょうか。
形を確認します。

どうやら、辞書の中に、restというkeyがあり、そのrestの中は１次元のリストがあるようですね。
さらにそのリストの中に辞書があり、idやnameやaddressといったkeyが入っています。
ミソなのは、restのすぐ下にリストがあるところです。
わかりにくいと思いますが次に進みましょう。

# 4.ぐるなびAPIを叩いてみる

以下のコードに取得したAPIkeyを当てはめて実行してください。

```grnb03.py
import requests
import pprint
import json

#レストラン検索APIのURL
url = "https://api.gnavi.co.jp/RestSearchAPI/v3/"

#パラメータの設定
params={}
params["keyid"] = "your api key" #取得したアクセスキー
params["name"] = "花見鮨"

#リクエスト結果
result_api = requests.get(url, params)
result_api = result_api.json() # 読まなきゃいけない！じゃないと<Response [200]>とでるだけ。
# print(result_api) # 整形せずにそのまま表示
# pprint.pprint(result_api) # 整形して表示

print(result_api['rest'][0]['address'])
# 無事に住所が表示されました
print(result_api['rest'][0]['name_kana'])
# カナも表示されました
print(result_api['rest'][0]['code']['areaname'])
# 関東
print(result_api['rest'][0]['code']['category_name_l'][:2])
# ['すし・魚料理・シーフード', '日本料理・郷土料理']リストは2個しかないから、全部出るんだけどね。
```
これは、店の名前が「花見鮨」というお店を検索して表示させています。
該当のお店は１件しかないので、１件分の情報が表示されます。

# 5.ぐるなびAPIを叩いてみる（２）
それでは、別の検索をしてみましょう。
目黒エリアのお寿司屋さんを検索します。
エリアは関東＞都道府県＞都市名　と分かれるのですが、それらは公式のページで確認してください。
都市名は「areacode_s」という区分です。目黒は、「AREAS2180」となります。

とりあえず何件ヒットするか確認〜

```grnb04.py
import requests
import pprint
import json

#レストラン検索APIのURL
url = "https://api.gnavi.co.jp/RestSearchAPI/v3/"

#パラメータの設定
params={}
params["keyid"] = "10b2e3ace737e45cebfff529a31888f8" #取得したアクセスキー
params["areacode_s"] = "AREAS2180" # 目黒
params["freeword"] = "すし"

#リクエスト結果
result_api = requests.get(url, params)
result_api = result_api.json() # 読まなきゃいけない！じゃないと<Response [200]>とでるだけ。
# print(result_api) # 整形せずにそのまま表示
# pprint.pprint(result_api) # 整形して表示

hit = len(result_api['rest'])
print(hit)
# 10 #目黒エリアでフリーワード「すし」は10コある！
```

では、ヒットした件数分の店名のみを表示させましょう。
先ほどのコードの下に追加します。

```grnb04.py
# ループで、ヒットした10件分の店名を表示させる
for i in range(hit):
    print(result_api['rest'][i]["name"])
```
鮨 りんだ 
鮨とふぐ のぐち 躙り口 ～Nijiriguchi～
花見鮨 
寿司居酒屋 日本海 目黒店
海鮮三崎港 目黒店
創作和食 和神 －WAZIN－ 目黒
きんくら酒場 金の蔵 目黒店
釣船茶屋ざうお 目黒店
桜Dining HIDARIUMA（左馬） 
駒八 目黒さんまセンター
できました！！！！！！！