LoginSignup
8
7

More than 5 years have passed since last update.

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

Last updated at Posted at 2018-11-19

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

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が、辞書の中にリストがある…そのような複雑な形になっています。
スクリーンショット 2018-11-19 15.15.29.png
https://api.gnavi.co.jp/api/tools/?apitype=RestSearchAPI
こちらのテストツールで、name=花見鮨
と入れた時の結果です。(目黒の美味しいお寿司屋さんですので、是非に)

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

どうやら、辞書の中に、restというkeyがあり、そのrestの中は1次元のリストがあるようですね。
さらにそのリストの中に辞書があり、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個しかないから、全部出るんだけどね。

これは、店の名前が「花見鮨」というお店を検索して表示させています。
該当のお店は1件しかないので、1件分の情報が表示されます。

5.ぐるなびAPIを叩いてみる(2)

それでは、別の検索をしてみましょう。
目黒エリアのお寿司屋さんを検索します。
エリアは関東>都道府県>都市名 と分かれるのですが、それらは公式のページで確認してください。
都市名は「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(左馬)
駒八 目黒さんまセンター
できました!!!!!!!

8
7
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
8
7