
こんにちは。
今回は 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 Forbidden429 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 裏通信が失敗している
ここを理解すると、一気に突破できます💪
リンク


コメント