Python Rakuten Travel APIs: Simple Hotel Search APIを使ってみた
今回は、Pythonを使ってみました。
環境構築不要なGoogle Colabを使ってみました。
Rakuten Developpersへの登録と、環境変数(application_id)の登録が必要です。
こちらを参考にさせていただきました。
JSONデータとして取得するスクリプト
import pandas as pd
import requests, json
from google.colab import userdata
# Google Colabの認証を付与する
from google.colab import auth
auth.authenticate_user()
def main(middle_class_code, small_class_code):
request_url = "https://app.rakuten.co.jp/services/api/Travel/SimpleHotelSearch/20170426"
app_id = userdata.get("RAKUTEN_APP_ID")
# print(app_id)
params = {
"format": "json",
"largeClassCode": "japan",
"middleClassCode": middle_class_code,
"smallClassCode": small_class_code,
"applicationId": app_id,
"hits": 30,
}
response = requests.get(request_url, params)
# レスポンスのステータスを確認し、データを表示
if response.status_code == 200:
data = response.json()
print(json.dumps(data, indent=4, ensure_ascii=False))
if __name__ == "__main__":
# main("kyoto", "shi")
main("okinawa", "nahashi")
ログ・こんな感じで取得できます
{
"hotel": [
{
"hotelBasicInfo": {
"hotelNo": 56315,
"hotelName": "パシフィックホテル沖縄",
"hotelInformationUrl": "https://img.travel.rakuten.co.jp/image/tr/api/hs/dQ4dX/?f_no=56315",
"planListUrl": "https://img.travel.rakuten.co.jp/image/tr/api/hs/cHNRi/?f_no=56315&f_flg=PLAN",
"dpPlanListUrl": "https://img.travel.rakuten.co.jp/image/tr/api/hs/TDZXm/?noTomariHotel=56315",
"reviewUrl": "https://img.travel.rakuten.co.jp/image/tr/api/hs/RmfmX/?f_hotel_no=56315",
"hotelKanaName": "ぱしふぃっくほてるおきなわ",
"hotelSpecial": "383室を持つ沖縄最大級のシティホテル。350台収容の平面駐車場あり(無料)。空港からお車で約8分。",
"hotelMinCharge": 2520,
"latitude": 94363.24,
"longitude": 459608.77,
"postalCode": "900-0036",
"address1": "沖縄県",
"address2": "那覇市西3-6-1",
"telephoneNo": "098-868-5162",
"faxNo": "098-868-8876",
"access": "沖縄都市モノレール(ゆいレール)旭橋駅より徒歩にて約14分",
"parkingInformation": "平面駐車場 無料 350台完備 出し入れ自由♪ 予約不要",
"nearestStation": "旭橋",
"hotelImageUrl": "https://img.travel.rakuten.co.jp/share/HOTEL/56315/56315.jpg",
"hotelThumbnailUrl": "https://img.travel.rakuten.co.jp/HIMG/90/56315.jpg",
"roomImageUrl": "https://img.travel.rakuten.co.jp/share/HOTEL/56315/56315_room.jpg",
"roomThumbnailUrl": "https://img.travel.rakuten.co.jp/HIMG/INTERIOR/56315.jpg",
"hotelMapImageUrl": "https://img.travel.rakuten.co.jp/share/HOTEL/56315/56315map.gif",
"reviewCount": 597,
"reviewAverage": 4.13,
"userReview": "国際通りからは少しだけ離れていますが、歩いて行ける距離で立地面は問題無いと思います。施設は少し年代を感じるもののメンテナンスは行き届いています。夕食と朝食のバイキングは大満足。コスパも良好と感じました… 2024-07-27 15:02:40投稿 <a href=\"https://img.travel.rakuten.co.jp/image/tr/api/hs/RmfmX/?f_hotel_no=56315\" class=\"3click\">つづきはこちら</a>"
}
},
{
"hotelRatingInfo": {
"serviceAverage": 3.94,
"locationAverage": 4.09,
"roomAverage": 3.81,
"equipmentAverage": 3.56,
"bathAverage": 3.54,
"mealAverage": 4.03
}
}
]
}
]
}
エリアコード一覧表
エリアコード一覧表をスプシにまとめました。
よかったらご活用ください。
Google Spreadsheetに書き出す処理
上記のsheetを作成したスクリプトです。
import requests, json
from google.colab import userdata
# Google Spreadsheetとの連携
import gspread
from google.auth import default
creds, _ = default()
gc = gspread.authorize(creds)
def main():
# 地区コードAPIのURL
request_url = "https://app.rakuten.co.jp/services/api/Travel/GetAreaClass/20131024"
app_id = userdata.get("RAKUTEN_APP_ID")
params = {"format": "json", "applicationId": app_id}
# 地区コードの取得
response = requests.get(request_url, params=params)
if response.status_code == 200:
area_data = response.json()
# JSONデータをインデント付きで表示
print(json.dumps(area_data, indent=4, ensure_ascii=False))
# Google Spreadsheetにデータを保存
set_area_data_to_spreadsheet(area_data)
else:
print(f"Error: API request failed with status code {response.status_code}")
def convert_to_2d_array(data):
result = [["middleClassCode", "middleClassName", "smallClassCode", "smallClassName"]]
middles = data["areaClasses"]["largeClasses"][0]["largeClass"][1]["middleClasses"]
# print(middles)
for middle in middles:
print(middle)
for small in middle["middleClass"][1]["smallClasses"]:
print(f"★{small}")
middle_code = middle["middleClass"][0]["middleClassCode"]
middle_name = middle["middleClass"][0]["middleClassName"]
small_code = small["smallClass"][0]["smallClassCode"]
small_name = small["smallClass"][0]["smallClassName"]
result.append([middle_code, middle_name, small_code, small_name])
# 結果を2次元配列として返す
print(result)
return result
def set_area_data_to_spreadsheet(area_data):
sheet_url = "https://docs.google.com/spreadsheets/d/***************"
spreadsheet = gc.open_by_url(sheet_url)
sheet = spreadsheet.worksheet("楽天ホテル検索API")
print(f'\nファイル名:{spreadsheet.title}')
print(f'シート名:{sheet.title}')
values = convert_to_2d_array(area_data)
sheet.update("A1", values)
print("Data written to Google Sheets successfully!")
print(sheet_url)
return
if __name__ == "__main__":
main()
ログ・こんな感じで取れます
{'middleClass': [{'middleClassCode': 'hokkaido', 'middleClassName': '北海道'}, {'smallClasses': [{'smallClass': [{'smallClassCode': 'sapporo', 'smallClassName': '札幌'}, {'detailClasses': [{'detailClass': {'detailClassCode': 'A', 'detailClassName': '札幌・新札幌・琴似'}}, {'detailClass': {'detailClassCode': 'B', 'detailClassName': '大通公園・時計台・狸小路'}}, {'detailClass': {'detailClassCode': 'C', 'detailClassName': 'すすきの・中島公園'}}]}]}, {'smallClass': [{'smallClassCode': 'jozankei', 'smallClassName': '定山渓'}]}, {'smallClass': [{'smallClassCode': 'wakkanai', 'smallClassName': '稚内・留萌・利尻・礼文'}]}, {'smallClass': [{'smallClassCode': 'abashiri', 'smallClassName': '網走・紋別・北見・知床'}]}, {'smallClass': [{'smallClassCode': 'kushiro', 'smallClassName': '釧路・阿寒・川湯・根室'}]}, {'smallClass': [{'smallClassCode': 'obihiro', 'smallClassName': '帯広・十勝'}]}, {'smallClass': [{'smallClassCode': 'hidaka', 'smallClassName': '日高・えりも'}]}, {'smallClass': [{'smallClassCode': 'furano', 'smallClassName': '富良野・美瑛・トマム'}]}, {'smallClass': [{'smallClassCode': 'asahikawa', 'smallClassName': '旭川・層雲峡・旭岳'}]}, {'smallClass': [{'smallClassCode': 'chitose', 'smallClassName': '千歳・支笏・苫小牧・滝川・夕張・空知'}]}, {'smallClass': [{'smallClassCode': 'otaru', 'smallClassName': '小樽・キロロ・積丹・余市'}]}, {'smallClass': [{'smallClassCode': 'niseko', 'smallClassName': 'ルスツ・ニセコ・倶知安'}]}, {'smallClass': [{'smallClassCode': 'hakodate', 'smallClassName': '函館・湯の川・大沼・奥尻'}]}, {'smallClass': [{'smallClassCode': 'noboribetsu', 'smallClassName': '洞爺・室蘭・登別'}]}]}]}
★{'smallClass': [{'smallClassCode': 'sapporo', 'smallClassName': '札幌'}, {'detailClasses': [{'detailClass': {'detailClassCode': 'A', 'detailClassName': '札幌・新札幌・琴似'}}, {'detailClass': {'detailClassCode': 'B', 'detailClassName': '大通公園・時計台・狸小路'}}, {'detailClass': {'detailClassCode': 'C', 'detailClassName': 'すすきの・中島公園'}}]}]}
★{'smallClass': [{'smallClassCode': 'jozankei', 'smallClassName': '定山渓'}]}
★{'smallClass': [{'smallClassCode': 'wakkanai', 'smallClassName': '稚内・留萌・利尻・礼文'}]}
★{'smallClass': [{'smallClassCode': 'abashiri', 'smallClassName': '網走・紋別・北見・知床'}]}
★{'smallClass': [{'smallClassCode': 'kushiro', 'smallClassName': '釧路・阿寒・川湯・根室'}]}
★{'smallClass': [{'smallClassCode': 'obihiro', 'smallClassName': '帯広・十勝'}]}
★{'smallClass': [{'smallClassCode': 'hidaka', 'smallClassName': '日高・えりも'}]}
★{'smallClass': [{'smallClassCode': 'furano', 'smallClassName': '富良野・美瑛・トマム'}]}