前回は、いろんなサイトから飲食店を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件出てきました。”ペット可”では”ペットと泊まれる”の文字列一致はしないわけですね。
【ペット】の結果