ぐるなびAPI

環境

  • Python 3.4.5
  • java 1.8.0

概要

PythonでぐるなびAPIからレストランデータを取得する。

[python]
# -*- coding: utf-8 -*-
import sys
import urllib.request
import json

####
# 変数の型が文字列かどうかチェック
####
def is_str( data = None ) :
if isinstance( data, str ) :
return True
else :
return False

####
# 初期値設定
####
# APIアクセスキー

keyid = ""
# エンドポイントURL
url = "http://api.gnavi.co.jp/RestSearchAPI/20150630/"
hit_per_page = 500

####
# APIアクセス
####
# URLに続けて入れるパラメータを組立
query = [
("format","json"),
("keyid",keyid),
("hit_per_page",hit_per_page)
]
# URL生成
url += "?{0}".format(urllib.parse.urlencode(query))
# API実行
try :
result = urllib.request.urlopen(url).read()
except ValueError :
print (u"APIアクセスに失敗しました。")
sys.exit()

####
# 取得した結果を解析
####
data = json.loads(result.decode(‘utf-8′))
# エラーの場合
if "error" in data :
if "message" in data :
print (u"{0}".format( data["message"] ))
else :
print (u"データ取得に失敗しました。")
sys.exit()

# ヒット件数取得
total_hit_count = None
if "total_hit_count" in data :
total_hit_count = int(data["total_hit_count"])

# ヒット件数が0以下、または、ヒット件数がなかったら終了
if total_hit_count is None or total_hit_count <= 0 :
print (u"指定した内容ではヒットしませんでした。")
sys.exit()

# レストランデータがなかったら終了
if not "rest" in data :
print (u"レストランデータが見つからなかったため終了します。")
sys.exit()

# ヒット件数表示
print ("{0}件ヒットしました。".format( total_hit_count ))

# レストランデータ取得
for rest in data["rest"] :
line = []
# id = ""
name = ""
# access_line = ""
# access_station = ""
# access_walk = ""
tel = ""
opentime = ""
latitude = ""
longitude = ""
”’
# 店舗番号
if "id" in rest and is_str( rest["id"] ) :
id = rest["id"]
line.append( id )
”’
# 店舗名
if "name" in rest and is_str( rest["name"] ) :
name = u"{0}".format( rest["name"] )
line.append( name )
”’
if "access" in rest :
access = rest["access"]
# 最寄の路線
if "line" in access and is_str( access["line"] ) :
access_line = u"{0}".format( access["line"] )
# 最寄の駅
if "station" in access and is_str( access["station"] ) :
access_station = u"{0}".format( access["station"] )
# 最寄駅から店までの時間
if "walk" in access and is_str( access["walk"] ) :
access_walk = u"{0}分".format( access["walk"] )
line.extend( [ access_line, access_station, access_walk ] )
”’
# 電話番号
if "tel" in rest and is_str(rest["tel"]) :
tel = rest["tel"]
line.append(tel)
# 営業時間
if "opentime" in rest and is_str(rest["opentime"]) :
opentime = rest["opentime"]
line.append(opentime)
# 緯度経度
if "longitude" in rest and is_str(rest["longitude"]):
longitude = rest["longitude"]
line.append(longitude)
if "latitude" in rest and is_str(rest["latitude"]):
latitude = rest["latitude"]
line.append(latitude)
# 出力
print ("\t".join(line))

sys.exit()
[/python]

ループで外部ファイルにデータを移す場合
[python]
# -*- coding: utf-8 -*-
import sys
import urllib.request
import json

####
# 変数の型が文字列かどうかチェック
####
def is_str( data = None ) :
if isinstance( data, str ) :
return True
else :
return False

####
# 初期値設定
####
# APIアクセスキー

keyid = "16147047739469cf3"
# エンドポイントURL
url = "http://api.gnavi.co.jp/RestSearchAPI/20150630/"
hit_per_page = 500
offset = 500

for offset in range(0, 550000, 500):
####
# APIアクセス
####
# URLに続けて入れるパラメータを組立
query = [
("format","json"),
("keyid",keyid),
("hit_per_page",hit_per_page),
("offset",offset)
]
# URL生成
url += "?{0}".format(urllib.parse.urlencode(query))
# API実行
try :
result = urllib.request.urlopen(url).read()
except ValueError :
print (u"APIアクセスに失敗しました。")
sys.exit()

####
# 取得した結果を解析
####
data = json.loads(result.decode(‘utf-8′))
# エラーの場合
if "error" in data :
if "message" in data :
print (u"{0}".format( data["message"] ))
else :
print (u"データ取得に失敗しました。")
sys.exit()

# ヒット件数取得
total_hit_count = None
if "total_hit_count" in data :
total_hit_count = int(data["total_hit_count"])

# ヒット件数が0以下、または、ヒット件数がなかったら終了
if total_hit_count is None or total_hit_count <= 0 :
print (u"指定した内容ではヒットしませんでした。")
sys.exit()

# レストランデータがなかったら終了
if not "rest" in data :
print (u"レストランデータが見つからなかったため終了します。")
sys.exit()

# ヒット件数表示
#print ("{0}件ヒットしました。".format( total_hit_count ))

# レストランデータ取得
for rest in data["rest"] :
line = []
# id = ""
name = ""
# access_line = ""
# access_station = ""
# access_walk = ""
tel = ""
opentime = ""
latitude = ""
longitude = ""
”’
# 店舗番号
if "id" in rest and is_str( rest["id"] ) :
id = rest["id"]
line.append( id )
”’
# 店舗名
if "name" in rest and is_str( rest["name"] ) :
name = u"{0}".format( rest["name"] )
line.append( name )
”’
if "access" in rest :
access = rest["access"]
# 最寄の路線
if "line" in access and is_str( access["line"] ) :
access_line = u"{0}".format( access["line"] )
# 最寄の駅
if "station" in access and is_str( access["station"] ) :
access_station = u"{0}".format( access["station"] )
# 最寄駅から店までの時間
if "walk" in access and is_str( access["walk"] ) :
access_walk = u"{0}分".format( access["walk"] )
line.extend( [ access_line, access_station, access_walk ] )
”’
# 電話番号
if "tel" in rest and is_str(rest["tel"]) :
tel = rest["tel"]
line.append(tel)
# 営業時間
if "opentime" in rest and is_str(rest["opentime"]) :
opentime = rest["opentime"]
line.append(opentime)
# 緯度経度
if "longitude" in rest and is_str(rest["longitude"]):
longitude = rest["longitude"]
line.append(longitude)
if "latitude" in rest and is_str(rest["latitude"]):
latitude = rest["latitude"]
line.append(latitude)
# 外部ファイルへ出力
lists = (",".join(line))
f = open(‘test.tsv’, "a")
f.write(lists)
f.close()

sys.exit()
[/python]