楽天APIで楽天トラベルの宿泊施設のリストを作成する

API

前回は、いろんなサイトから飲食店を1つずつ探していくのが非常に手間だったので、
ホットペッパーグルメAPIを使って1活でデータ取得を行い、リストを作成しました。

今回も同様の理由で、犬と行ける宿泊施設を取得するため楽天トラベルのデータを取得するAPIを試してみました。
要件や手順は前回の飲食店を取得したときと同様です。

APIキーを取得

今回はRakuten DevelopersサイトからAPIキーの取得になります

APIのところを見ると楽天市場を含めていくつかのAPIがありますね。

APIキーという名称ではなく、アプリケーションIDというものだそうです。

まずは画面右上部の【+New App】をクリックし、楽天のアカウントでログインします。

次に【Register a new application】のページに必要事項を埋めます

Application URLは使用するアプリのURLですが、ローカルで実行するだけであれば、何か自分のサイトのURLを入れると良いと思います。

作成すると【Created successfully】と表示されて
【Application ID/developer ID】と記載されている横にIDがあると思いますので、これを保持します

ドキュメントから必要情報を参照

API詳細を確認します

今回の目的は前回同様【ペット可】の施設を取得することにありますので

デフォルトのSimple Hotel Search APIにはそれをフィルタリングするパラメーターはなさそうなので
Keyword Hotel Search APIを使用します。

エンドポイントは

https://app.rakuten.co.jp/services/api/Travel/KeywordHotelSearch/20170426

入力パラメータで必須なのは先程取得したapplicationIdと検索キーワードであるkeywordですね。
あとでオプションでmiddleClassCode(都道府県などを示すコード)はつけたいですね。

テスト

とりあえず、テスト。今回もpyhtonでリクエストします


import requests
url = "https://app.rakuten.co.jp/services/api/Travel/KeywordHotelSearch/20170426"
apikey = "" # 先程取得したアプリケーションキー

params = {
        "applicationId": apikey, 
        "format": "json",
        "keyword": "ペット可"
    }

response = requests.get(url, params=params)
print(response) # <Response [200]> なら成功

返ってきたデータを見てみましょう。

data = response.json()
print(data)

ずらっとjson形式のデータが返ってきています。
問題なさそうですね

調査と改善

さて、先程のリクエストを修正する前に、レスポンスを整理します。

print(data.keys())
 # dict_keys(['pagingInfo', 'hotels'])

2つのキーがあります。前者はメタデータで後者が実際にほしいデータと思われます。

print(data['pagingInfo'].keys())
 # dict_keys(['recordCount', 'pageCount', 'page', 'first', 'last'])

print(data['pagingInfo']['recordCount']) # 検索結果のレコード件数 つまり結果の全件
print(data['pagingInfo']['pageCount']) # 総ページ数
print(data['pagingInfo']['page']) # 現在のページ番号
print(data['pagingInfo']['first']) # ページ内結果開始番号
print(data['pagingInfo']['last']) # ページ内結果終了番号

pagingInfoの情報を使って、全件取得するにはループする必要がありそうです。

print(data['hotels'].keys())
 # AttributeError: 'list' object has no attribute 'keys' → リスト型でした

print(data['hotels'][0]) 
 # とあるホテル情報
print(data['hotels'][0].keys())
 # dict_keys(['hotel'])
print(data['hotels'][0]['hotel'])
 # 
print(data['hotels'][0]['hotel'][0])
print(data['hotels'][0]['hotel'][0]['hotelBasicInfo'].keys()) ## ここでやっと実際のホテル情報
print(data['hotels'][0]['hotel'][1]['hotelRatingInfo']) # これは顧客の満足度の評価ですね


思ったより深かった。。きっと配列が増えることもあるのだろうが、今回は調査しない

とりあえず必要そうなデータの位置はわかりました。
また、実際のリクエストでは場所でフィルタを掛けたいので、
楽天トラベル地区コードAPIを叩く必要がありそう。

https://webservice.rakuten.co.jp/documentation/get-area-class # エンドポイント
url = 'https://app.rakuten.co.jp/services/api/Travel/GetAreaClass/20131024'
params = {
        "applicationId": apikey, 
        "format": "json"
    }

response = requests.get(url, params=params)
area_mst = response.json()

## area_mstの中をなんやかんや調査
for area in area_mst['areaClasses']['largeClasses'][0]['largeClass'][1]['middleClasses']:
	print(area)

## 引き続きなんやかんや

とにかく楽天のレスポンスデータは深い!笑
とりあえずわかったことは、middleClassCodeは都道府県でsmallClassCodeが市区町村であろうということ、
また、幸い(?)にもコードがわかりやすい

{'middleClassCode': 'okinawa', 'middleClassName': '沖縄県'}
{'smallClassCode': 'Miyako', 'smallClassName': '宮古島・伊良部島'}

今回は静岡県の伊豆高原のデータがほしいので、キーワード検索APIのmiddleClassCodeは
sizuokaとかshizuokaで行けそう → shizuokaでした

実行

では本題

url = "https://app.rakuten.co.jp/services/api/Travel/KeywordHotelSearch/20170426"
prefecture = 'shizuoka'

params = {
        "applicationId": apikey,
        "format": "json",
        "middleClassCode": prefecture,
        "sort":"+roomCharge", # 料金が安い順に並べ替える
        "keyword": "ペット可" # kw
    }

response = requests.get(url, params=params)

data = response.json()

print(data['pagingInfo']['recordCount']) # 静岡県・ペット可は36件でした


hotels = data["hotels"]

datas = []
for hotel in hotels:
    hotel2 = hotel["hotel"]
    hotel3 = hotel2[0]["hotelBasicInfo"]
    rating = hotel2[1]["hotelRatingInfo"]
    hotel3.update(rating)
    datas.append(hotel3)


# dataframeでみやすくする
import pandas as pd
datas_df = pd.DataFrame(datas)

# excelに出力
datas_df.to_excel("静岡県のペット可の宿泊施設.xlsx", index=False)

結果のエクセルはこんな感じ。必要なデータが取れてフィルタリングしたりソートしたり出来てこっちの方が便利!

終わりに

ということで楽天APIを使用したAPIですが
静岡県でペット可少なくないか?とちょっと思いましたが、実際のページでも同数でした。

ペット可 静岡で検索した結果

“ペット可”というキーワード検索がまずかったようで”ペット”とすれば299件出てきました。”ペット可”では”ペットと泊まれる”の文字列一致はしないわけですね。

【ペット】の結果

タイトルとURLをコピーしました