今回したこと
お得な旅ができるとよく宣伝を見るagodaの宿泊先の金額が気になったので、スクレイピングで取得して、見てみました。
ちなみにagodaはjavascriptによる描画をしているようで、普通にbeautifulsoupを使っても値が取得できません(多分React.jsを使っている?)
ですので、ブラウザ表示した結果を取得します。参考にさせていただいたサイトは以下です。
対象
今回着目したホテルは「中通温泉 こまちの湯 ドーミーイン秋田」です。
我らがドーミーインの秋田支店です。
ドーミーインと言えば、夜は無料のラーメンも食べれて、朝はご当地グルメなビュッフェが食べられるという僕もファンの一人であるビジネスホテルです。
以前、ドーミーインに行ったときには部屋にお水と白桃ゼリーが置いてあって、ほっこりし、
夜泣きそばという夜無料のラーメンも食べれて良い時間を過ごせました。
今回はドーミーインなら朝食付きってことで、朝食付きの禁煙の部屋の最安値を調べていきます。
大人一人で一泊という設定で調べてみます。
ちなみに、朝食抜きプランも素泊まりなら以下のように1800円のオプションで朝食を付けられるようになっているのですが、
朝食込みだと以下のように1800円足される料金なので、朝食込みプランで安くなるとかは無いようですね。
コード
コードはpythonで書いています。
3日後のホテルの最安値から200日後の最安値までの金額の推移を測ろうと試みました。
コードは以下のようになりました。
import requests
from bs4 import BeautifulSoup
import time
import pandas as pd
import re
from datetime import datetime
from datetime import timedelta
import time
from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
current_date = datetime.now()
url_1 = 'https://www.agoda.com/ja-jp/dormy-inn-akita-natural-hot-spring/hotel/akita-jp.html?finalPriceView=2&isShowMobileAppPrice=false&cid=1891462&numberOfBedrooms=&familyMode=false&adults=1&children=0&rooms=1&maxRooms=0&checkIn='
url_2 = '&isCalendarCallout=false&childAges=&numberOfGuest=0&missingChildAges=false&travellerType=0&showReviewSubmissionEntry=false¤cyCode=JPY&isFreeOccSearch=false&tag=b5642155-2a83-0f39-449b-50efc3770fb8&isCityHaveAsq=false&tspTypes=1%2C16&los=1&searchrequestid=2ecee3b1-a2b1-4268-9355-1228b575fec4&ds=bPOZqqH4S1HY8khy'
# Chromeドライバーのパスを指定
chrome_driver_path = '/home/appare99/git_python_codes/chromedriver.exe'
hotel_price_info = []
for day_i in range(4, 201):
# Chromeドライバーのサービスオブジェクトを作成
get_date = current_date + timedelta(days=day_i)
url_date = url_1 + str(get_date) + url_2
service = Service(chrome_driver_path)
# Chromeドライバーを起動
chrome_driver = webdriver.Chrome(service=service)
# ウェブページを取得
chrome_driver.get(url_date)
# HTMLを文字コードをUTF-8に変換してから取得します。
html = chrome_driver.page_source.encode('utf-8')
try:
# 要素がクリック可能になるまで待機
element = WebDriverWait(chrome_driver, 10).until(
EC.element_to_be_clickable((By.CSS_SELECTOR, '[data-element-name="room-grid-filter-non-smoking"]'))
)
# 要素をクリック
element.click()
except:
pass
try:
# 要素がクリック可能になるまで待機
element = WebDriverWait(chrome_driver, 10).until(
EC.element_to_be_clickable((By.CSS_SELECTOR, '[data-element-name="room-grid-filter-breakfast-include"]'))
)
element.click()
except:
pass
soup = BeautifulSoup(html, "html.parser")
room_content = soup.find('div', {'class': 'ChildRoomsList-room-contents'})
price_element = room_content.find('div', {'class': 'LowestPriceYouSeen'})
price = price_element['data-current-price']
hotel_price_info.append(
{
'lowest_price': int(price),
'date': get_date.strftime("%Y-%m-%d"),
}
)
time.sleep(5)
chrome_driver.quit()
結果
取得した値をグラフ化すると、以下のようになりました。
見にくくて恐縮ですが、プログラムを実行した3/20の3日後の3/23~8/2までのグラフになっています。
200日後の値まで取得する予定だったのですが、
8/3以降は最安値の「LowestPriceYouSeen」というclassが無くなってしまい、以下のように価格が急騰します。。
グラフを見ると3/29の価格が急騰以外はある程度レンジの中で動いています。
ただ、安い時に比べて高い時は2倍ほどの金額になっています。
ここで、週末(土日)と祝日に赤い線を入れた結果を求めてみます。
もうちょっとわかりやすく、特徴を記入した結果も載せます。
概ねの金額感は以下のように変化しています。
「phase 1」:平日で6,500~7,300円ほどのレンジ
「phase 2」:平日で7,800~8,500円ほどのレンジ
「phase 3」:平日で6,500円ほど
「phase 1」は最初の2週間ほど、
「phase 2」は2週間以降から3ヶ月
「phase 3」は3ヶ月から1ヶ月間ほど
また、土曜日に価格が上がっていて、ゴールデンウィークも価格が上がっています。
平日の推移をみると、直近では安くなり、少し先の未来ではちょっと高くなり、その後は1ヶ月間ぐらいまた安くなり、その後、金額が急騰するといった流れになっていそうです。
黄金期は3ヶ月後から1ヶ月間になりそうです。(今後ほかの宿泊場所でも見ていきたいと思います。)
おまけ
上記のagodaの最安値のところに「提供元:るるぶトラベル」との記載があります。
試しに、るるぶトラベルに行ってみると、agodaと全く同じUIでした。
これはagodaの皮をかぶったるるぶトラベル?ってことなのでしょうか。。