🎢Seleniumでディズニーのレストラン予約を自動監視したら「Loading地獄」にハマった話

Pytyon

こんにちは。
今回は Python+Seleniumでディズニーのレストラン予約キャンセル拾いを自動化しようとして盛大に詰まった話 を共有します😇

同じように

  • キャンセルが出たらLINE通知したい
  • Seleniumで検索まではできる
  • でも「Loading…」から先に進まない

という方、たぶん同じ罠にハマってます


🧩 やりたかったこと

  • Python(Selenium + ChromeDriver)
  • 日付・人数を入力
  • 検索ボタンをクリック
  • 空きが出たら LINEに通知📩

ここまでは順調でした。


❌ 発生した問題:「Loading」のまま固まる

検索ボタンを押すと…

  • 画面に 「Loading」表示
  • いつまで経っても結果が出ない
  • Selenium側は タイムアウト

🤔
人間が普通に操作すると問題なく検索できるのに、
Selenium経由だと固まるという非常に厄介な状態。


🔍 最初に疑ったこと(そしてハマった)

  • time.sleep(10) を増やす
  • page_load_timeout を伸ばす
  • 再起動・ドライバ更新

👉 全部ダメでした😇


💡 原因①:ページ遷移していない(SPA / 非同期通信)

ディズニーの予約ページは、

  • ボタンを押しても ページ遷移しない
  • 裏で XHR(非同期通信) が走る
  • Seleniumの page_load_timeout一切役に立たない

つまり…

「ページがロードされるのを待つ」
ではなく
「状態が変わるのを待つ」必要がある

というのが最大の落とし穴でした。


✅ 対策①:「Loadingが消える」ことを待つ(超重要)

❌ ダメな例

search_btn.click()
time.sleep(10)

✅ 正しい例

from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC

wait = WebDriverWait(driver, 30)

# 検索ボタンをクリック
search_btn.click()

# Loading表示が出るのを待つ
wait.until(
    EC.presence_of_element_located(
        (By.XPATH, "//*[contains(text(), 'Loading')]")
    )
)

# Loadingが消えるのを待つ
wait.until(
    EC.invisibility_of_element_located(
        (By.XPATH, "//*[contains(text(), 'Loading')]")
    )
)

「出現 → 消滅」の2段階待ち
これだけで一気に安定しました。


💡 原因②:裏の通信が失敗している(403 / 429)

さらに調べると…

  • Selenium操作時だけ
    • 403 Forbidden
    • 429 Too Many Requests
  • 通信が失敗 → UIはLoadingのまま

というケースもありました。


✅ 対策②:Chromeのネットワークログを見る

logs = driver.get_log("browser")
for log in logs:
    print(log)

または(Chrome限定)👇

opts.set_capability("goog:loggingPrefs", {"performance": "ALL"})

📌 ここで403や429が出ていたら
→ サイト側で 自動操作・高頻度アクセス制限 が入っている可能性大。


💡 原因③:headlessモードだけ失敗する

これもかなりハマりました。

  • headless=True → Loadingで止まる
  • 通常ブラウザ → 問題なし

✅ 対策③:まずは headless を外す

options.add_argument("--headless")  # ← 一旦コメントアウト

✔ 動くなら
→ 待ち条件 or 描画タイミング依存の問題。


🛠 実際にやって安定した構成(まとめ)

私が最終的に採用したポイント

  • time.sleep() は使わない
  • 🔄 「Loadingの出現→消滅」を待つ
  • 🧭 結果要素が表示されたかで判定
  • 🖥 headlessなしでまず検証
  • 📸 タイムアウト時はスクショ保存
driver.save_screenshot("timeout_debug.png")

⚠ 注意点(超重要)

ディズニーの予約・チケット系ページは、

  • 利用規約
  • 高頻度アクセス制限
  • 不正検知

非常に厳しいです⚠

👉 本番運用する場合は

  • 実行間隔を十分に空ける
  • 過剰なリロードをしない
  • あくまで「個人利用・補助目的」で

この辺は必ず意識した方が安全です。


🎯 結論:Loadingで止まる=Selenium失敗ではない

❌ Seleniumが壊れている
待ち方が間違っている or 裏通信が失敗している

ここを理解すると、一気に突破できます💪

コメント

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