いよいよ冬到来。
ボーナスGETできる方々は、旅行にでも行こうか~なんて思案している頃合いじゃないでしょうか。
私のPython学習はサボったりやる気出したりとゆーーっくり進んでおり、
最終目標は
「スクレイピングしてお気に入りの宿が安くなった時に通知するアプリを作る」
だけど、とりあえず楽天トラベルAPIを使ってどうにかしようと試行錯誤中。
まず、私はAPIを知らなかったので調べた。。。
私たちが普段ネットでWEBサイトを見る時は、WEBブラウザが地球上のどこかにあるWEBサーバに対してリクエストを投げ、返ってきたデータでサイトを表示してくれている。
WEB APIは、WEBブラウザの代わりにリクエストをWEBブラウザに投げ、特定のデータを取得してくれる。
WEBページの長~いHTMLを解読してデータを抽出する必要がなく、いくつかのパラメータをWEBサーバに投げるだけで必要な情報をゲットできるから楽。ということらしい。
そんで、お気に入りの宿の空き室検索をするためには「楽天トラベル空室検索API」を使うのだが、それには「楽天トラベル施設検索API」で取得する施設番号が必要で、施設番号を調べるには「楽天トラベル地区コードAPI」で取得する地区コードが必要らしい。
うわあ/(^o^)\
めんどくせぇ。。。となりながらも、まずは「楽天トラベル地区コードAPI」から地区コード一覧表を作ることに。
最初、Pythonの本を片手に自分で頑張ろうと試行錯誤したけど、レスポンスで返ってくるデータがJSON形式で、これを整形してCSVに落とすのがどうにもうまくいかない。
こういう時はググって出てきたソースコードをコピペ w
ということで無事、地区コード一覧表を作成。
↓参考にさせていただいたサイト
ソースコードをいっぱい載せてくれている優秀なボランティアエンジニアの方々に感謝しかない。
その後、得られた地区コードを使って「楽天トラベル施設検索API」で宿の施設番号の一覧表を作ることに。
まず、楽天トラベルAPIのサイトに行って、「楽天トラベル施設検索API」のテストフォームを開く。
そして、パラメータをセットして送信すると、JSON形式で書かれた宿情報がずらーっと表示される。
※この時セットするパラメータは前ページの「入力パラメータ」欄を参照
このデータをひとまずコピペして保存。
これがPythonプログラムからrequests.getでWEBサーバにリクエストを投げた時に返ってくるデータとなるので、データを抽出するコードを書くときに参考になる。
そして、先だってコピペさせていただいたソースコードとPythonの参考書を見ながらコードを書いてみた。
今回は、静岡県熱海市の禁煙ルームのある部屋を安い順に列挙し、CSV出力。
import json
import pandas as pd
import datetime
REQUEST_URL = "https://app.rakuten.co.jp/services/api/Travel/SimpleHotelSearch/20170426"
APP_ID = "xxxxxxx" #自分のAPP_ID
### 総ページ数を調べる
params = {
"format":"json",
"applicationId":APP_ID,
"largeClassCode":"japan",
"middleClassCode":"shizuoka", #静岡県
"smallClassCode":"atami", #熱海市
"squeezeCondition":"kinen", #禁煙ルーム
"responseType":"small"
}
response = requests.get(REQUEST_URL, params) #URLとパラメータで検索
res = json.loads(response.text) #取得したデータを辞書型に変換
page_count = res["pagingInfo"]["pageCount"] #取得したデータから総ページ数を抽出して変数page_countに代入
### 1ページ目から最終ページまで、宿情報を取得
list_a = []
list_b =[ ]
for i in range(1,page_count+1):
params = {
"format":"json",
"applicationId":APP_ID,
"largeClassCode":"japan",
"middleClassCode":"shizuoka",
"smallClassCode":"atami",
"squeezeCondition":"kinen",
"responseType":"small",
"sort":"+roomCharge",
"page":i
}
response = requests.get(REQUEST_URL, params)
res = json.loads(response.text)
hotel_data = res['hotels'] #取得したデータから宿情報を抽出して変数hotel_dataに代入
for j in range(len(hotel_data)):
list_a.append(hotel_data[j]['hotel'][0]['hotelBasicInfo']["hotelNo"]) #施設番号
list_b.append(hotel_data[j]['hotel'][0]['hotelBasicInfo']["hotelName"]) #施設名
### データを整形してCSV出力
data_a = pd.DataFrame(list_a, columns = ["hotelNo"])
data_b = pd.DataFrame(list_b, columns = ["hotelName"])
data_all = pd.concat([data_a, data_b], axis=1, ignore_index=False) #data_aとdata_bを結合
csv_date = datetime.datetime.today().strftime("%Y%m%d%H") #今日の日付を取得
csv_file_name = "rakuten_travel_shisetsu_" + csv_date + ".csv"
data_all.to_csv(csv_file_name, encoding='utf_8_sig', index=False) #CSVに出力
ソースコードを保存してあるフォルダに
「rakuten_travel_shisetsu_20xxxxxx(今日の日付).csv」
というファイルが作成されたら成功。
できた~
道のりは長い(^ω^)
-------------------------------
(補足)
" list_a = [ ] " の " [ ] " について、
括弧の中にスペースを入れないとなぜか括弧が消えてしまう(勉強不足で原因分からず)ので入れたけれど、本来はスペースはいらないです。