見出し画像

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': '富良野・美瑛・トマム'}]}

過去にGASでも試みています。


いいなと思ったら応援しよう!