Python でぐるなび API 使ってみた (解説編)
こんにちは、こんばんは、お疲れ様です。
最近 Python で、ぐるなびの API を使って、ぐるなびに登録されている お店の情報を取得しました。
この記事では、Python を使ってぐるなび API を使う方法の解説をまとめます。
API がわからないという方は、以下の記事を参照すると概要を把握できると思います。
Python を使ってぐるなび API を使う方法は、以下の記事にまとめています。
今回の作業の環境は以下の通りです。
以下が目次です。
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 の作成
等を考えています。
上記で書いてほしい内容などありましたら、コメントの記入お願いします。