よくあるあれです。
リストと辞書が、複雑にネスト?ごっちゃになったやつから、希望するデータだけを抜き出したいですね。
そこらへんの構文の復習も踏まえてやっていきます。
1.APIを取得する
まずは、API keyを取得しなければなりません。
https://api.gnavi.co.jp/api/
こちらから新規アカウントを作成して、キーを取得してください。
2.辞書型の復習
辞書型の復習をしておきます。
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でやりましたが、辞書の中にリストがあったり…その中に辞書があったり…
複雑な形はどうしたら良いでしょうか?
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が、辞書の中にリストがある…そのような複雑な形になっています。
https://api.gnavi.co.jp/api/tools/?apitype=RestSearchAPI
こちらのテストツールで、name=花見鮨
と入れた時の結果です。(目黒の美味しいお寿司屋さんですので、是非に)
この中の、address(住所)を取りたい時はどうしたらよいでしょうか。
形を確認します。
どうやら、辞書の中に、restというkeyがあり、そのrestの中は1次元のリストがあるようですね。
さらにそのリストの中に辞書があり、idやnameやaddressといったkeyが入っています。
ミソなのは、restのすぐ下にリストがあるところです。
わかりにくいと思いますが次に進みましょう。
4.ぐるなびAPIを叩いてみる
以下のコードに取得したAPIkeyを当てはめて実行してください。
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」となります。
とりあえず何件ヒットするか確認〜
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コある!
では、ヒットした件数分の店名のみを表示させましょう。
先ほどのコードの下に追加します。
# ループで、ヒットした10件分の店名を表示させる
for i in range(hit):
print(result_api['rest'][i]["name"])
鮨 りんだ
鮨とふぐ のぐち 躙り口 ~Nijiriguchi~
花見鮨
寿司居酒屋 日本海 目黒店
海鮮三崎港 目黒店
創作和食 和神 -WAZIN- 目黒
きんくら酒場 金の蔵 目黒店
釣船茶屋ざうお 目黒店
桜Dining HIDARIUMA(左馬)
駒八 目黒さんまセンター
できました!!!!!!!