API活用

【楽天API】楽天トラベルで空室情報を取得する

記事内に商品プロモーションを含む場合があります

こんにちは、hokkyokunです。
楽天APIを使って情報を取得してみます。

楽天の空室情報をAPIを使ってリスト化します。

APIを利用するための準備

APIを利用するためにはアプリ登録を済ませ
APIキーを発行させる必要があります。

【楽天APIの準備】APIキーの発行方法 こんにちは、hokkyokunです。 前回、楽天APIをブラウザで試してみました。 ブラウザ上でもAPIを叩いて情報を取得...

Pythonコード

早速ですが、Pythonコードです。

基本的にはrequests.getメソッドでリクエストを投げるだけで情報を取得できます。
めちゃくちゃ簡単!

引数のparamsで色々指定することで
情報の絞り込みができます。
そちらは下記で色々実例を示しています。

def fetch_vacant_info(params):
    """
    楽天APIを利用してホテルの空室情報を取得します。
    paramsを調整することで調べたい地域や宿泊日、条件を絞り込むことができます。
    """
    #空室検索
    end_point="https://app.rakuten.co.jp/services/api/Travel/VacantHotelSearch/20170426"

    df=pd.DataFrame()

    #リクエストで投げる。これだけで取得できる!
    response=requests.get(url=end_point,params=params)

    if response.status_code!=200:
        return df
    
    data=response.json()
    #page数を取得
    page=data["pagingInfo"]["pageCount"]

    for i in range(page):
        params|={"page":i+1}
        response=requests.get(url=end_point,params=params)
        data=response.json()

        #jsonデータを見やすくするためにデータフレーム(df)形式に変換
        hotels=data["hotels"]
        for hotel in hotels:
            #ホテル基本情報
            hotel_basic_info=hotel["hotel"][0]["hotelBasicInfo"]

            df_hotel_basic_info=pd.DataFrame(hotel_basic_info,index=[0])

            #プランを取得
            #ホテルによってプラン数は異なる(最大3つまでしか取れない)
            len_=len(hotel["hotel"])
            for j in range(1,len_):
                room_info=hotel["hotel"][j]["roomInfo"]

                #部屋基本情報
                room_basic_info=room_info[0]["roomBasicInfo"]
                df_room_basic_info=pd.DataFrame(room_basic_info,index=[0])
                
                #部屋代金
                dailyCharge=room_info["dailyCharge"]
                df_dailyCharge=pd.DataFrame(dailyCharge,index=[0])


                #ホテル基本情報、部屋基本情報、部屋代金のデータを結合し、dfに格納
                df=df.append(
                    pd.concat([df_hotel_basic_info,df_room_basic_info,df_dailyCharge],axis=1),
                    ignore_index=True
                )

    return df

使い方

上記の関数を実際に使用してみます。
引数としてパラメーターを設定できるようにしました。

パラメーターをいじることで
データを好きなように絞り込んで抽出できます。

パラメーターの設定方法

パラメーターの設定方法は公式ドキュメントに記載されています。
詳しくはそちらで確認していただきたいのですが、

よく使うであろうパラメーターを紹介しておきます。

パラメーターデフォルト説明
largeClassCode国を示すコード
例:”japan”
middleClassCode都道府県等を示すコード
例:”hokkaido”
smallClassCode市などを示すコード
例:”sapporo”
detailClassCodeさらに詳細を指定するコード
大都市など限られた地域で用意されている
例:”A”(札幌・新札幌・琴似)
checkinDate本日チェックイン日を指定
例:2023-12-05
checkoutDate明日チェックアウト日を指定
例:2023-12-06
maxCharge上限料金を指定

これ以外にもまだまだあります。

例えば大人何名、子供何名を指定したり
緯度経度を指定し、半径何キロ以内を指定することも可能です。

実例1 北海道札幌市で検索

実例として北海道札幌市、A地区(札幌・新札幌・琴似エリア)の空室情報を取得してみます。

日付は2023/12/10チェックイン、2023/12/11チェックアウトを想定してみます。

#空室紹介
    #API_KEYは自分のキーを指定
    params={
        "applicationId":API_KEY,
        "largeClassCode":"japan",
        "middleClassCode":"hokkaido",
        "smallClassCode":"sapporo",
        "detailClassCode":"A",
        "checkinDate":"2023-12-10",
        "checkoutDate":"2023-12-11"
    }
    df_vacant=fetch_vacant_info(params)
    df_vacant.to_csv("../datas/vacant_hotel.cav",encoding="utf-8-sig",index=False)

取得したデータを開いてみます。

項目を全部拾ったのでごちゃごちゃっとしていますが、
ホテルの基本情報から口コミ評価点、部屋代などかなり情報量は満載です。

ちなみに、上記の条件で取得したホテル数は86件ありました。

全部を一気に取得するのは手動では難しいですが、Pythonなら簡単です。
ここから口コミ点数で絞ったりしても良いですね。

実例2 札幌駅から半径500メートル以内で検索

次はある地点からの距離で絞ってみようと思います。
半径0.1~3キロ以内で絞り込むことが可能です

札幌駅から半径500メートル以内のホテルで空き状況を検索してみます。

私が調べた限りは楽天APIではおそらく、緯度経度は駅名からとれないので
自力で調べるか別のAPIを組み合わせる必要がありそうです。

緯度経度はグーグルマップで調べました。

緯度経度を設定する際は
datumType:1
にしておくことをおすすめします。

こうしておくと東経○○度、北緯○○度の○○をそのまま緯度経度として使用できます。

例えば札幌駅は
東経141.35076度
北緯43.06881度なので
この数字をそのまま引数に使えます。

#空室紹介
#札幌駅から半径500メートル以内の空き状況
params={
    "applicationId":API_KEY,
    "checkinDate":"2023-12-10",
    "checkoutDate":"2023-12-11",
    "latitude":43.06881,
    "longitude":141.35076,
    "datumType":1,
    "searchRadius":0.5
}
df_vacant_within_radius=fetch_vacant_info(params)
df_vacant_within_radius.to_csv("../datas/vacant_hotel_within.csv",encoding="utf-8-sig",index=False)

データとしては同じような感じですが、
ホテル数は35とかなり少なくなりました。

実例3 10000円以内で検索

上記の札幌駅500メートル以内で10000円以内で絞り込みます。
データを吐き出した後、データフレームを直接絞り込んでもいいのですが、
APIのパラメーターで最大料金での絞り込みができるのでそちらを利用する方が
通信の節約にもなります。

#空室紹介
#札幌駅から半径500メートル以内の空き状況
#料金の上限10000円
params={
    "applicationId":API_KEY,
    "checkinDate":"2023-12-10",
    "checkoutDate":"2023-12-11",
    "latitude":43.06881,
    "longitude":141.35076,
    "datumType":1,
    "searchRadius":0.5,
    "maxCharge":10000
}
df_vacant_within_radius=fetch_vacant_info(params)
df_vacant_within_radius.to_csv("../datas/vacant_hotel_under_10000yen.csv",encoding="utf-8-sig",index=False)

データ数は26となりました。
順調に絞り込めました。

所感

拍子抜けするくらい簡単に取得ができました。
これで無料で使えるなんてすごい!

特に空室照会は取得できると、自分で旅行するにもいいですし、
アフェリエイトコードも取得できるので
ブログなど自分のサイトを持っている人はビジネスチャンスにもなります。

  • サーバーをレンタル
  • プログラムを定期実行
  • ウェブサイトで予約困難ホテルをリアルタイムで空席照会
  • アフェリエイトコードを張り付けて紹介料をゲット

みたいなビジネスもいいですし、
会員登録をしてもらってメールやLineに空き次第返答みたいなサービスを展開するのもありだなと思いました。

APIのリクエスト回数の問題や更新の頻度を考える必要もありますが、
できない話でもないかなと思います。
こういうことを考えるのが最近好きです(笑)

何はともあれ、ちょこっとプログラミングができるようになるだけで
可能性は広がります。

そして、プログラミング学習は独学でも学ぶことができますが、
時間が多くかかることも事実です。

書籍や動画、プログラミングスクールなど有料コンテンツもたくさんあります。

お勧めは動画コンテンツでの学習です。
プログラミングは書籍だとPCの操作などでわかりにくいところもありますので
連続性のあるコンテンツの方が学習効率が高いです。

動画コンテンツはUdemy一択です。
Udemyの公式サイトはこちらです。

また、質問や相談できる環境を作ると学習効率や質はさらに上がります。
特に独学だと知識の範囲が偏りがちなので、知らないばかりに複雑なコードを書いてしまうことがよくあるので、聞ける環境を作るのはおすすめです。

SAMURAI TERAKOYAは
月額2980円で質問ができる環境を作ることができます。

関連リンク

楽天API

ワードプレス自動化