Tony Wang6 分で読めますExpedia のスクレイピング方法(2026年版・API & Python)
2026年に Expedia をスクレイピングする方法 — ホテル検索、詳細、レビュー、アクティビティ、フライト。DIY、ノーコード、構造化 API の3通りと法律上の基本を解説します。
2026年に Expedia をスクレイピングする最も手早い方法は、Expedia の内部エンドポイントを自分でリプレイするのではなく、正規化された JSON を返す構造化 API を呼び出すことです。返ってくるのは、ホテル検索、物件詳細、宿泊者レビュー、アクティビティ、フライトのオファーです。Expedia は世界最大級の OTA の一つであり、Booking.com の直接の競合ですが、その公式 API はパートナー限定であり、ページは実際のアンチボット防御の背後で動いています。このガイドでは3つのアプローチすべてを取り上げ、DIY がどこで破綻するか、そして法律上の基本を解説します。
なぜ Expedia をスクレイピングするのか?
Expedia のホテル、アクティビティ、フライトのデータは次のような用途を支えます。
- ホテルの価格と空室状況のモニタリング — 物件のレートが日付、部屋数、シーズンによってどう動くかを追跡できます。
- OTA 間のレートパリティチェック — 同じ日付について、あるホテルの Expedia 価格を Booking.com、Airbnb、その他のチャネルと比較できます。
- 旅行メタサーチ製品 — 目的地についてホテル、アクティビティ、フライトを横断した検索・比較を実現できます。
- 市場調査 — 市場や物件タイプごとに価格、レビュースコア、在庫を追跡できます。
- AI・データパイプライン — 予測、旅程作成、レコメンデーションシステムに構造化された旅行データを供給できます。
Expedia をスクレイピングするのは合法か?
選択肢1: Python で DIY する(そしてなぜ破綻するか)
Expedia のホテル・フライトページは JavaScript フロントエンドの背後にある内部 JSON エンドポイントからレンダリングされるため、DIY のスクレイパーはそれらの呼び出しをリバースエンジニアリングし、本物のブラウザ相当のヘッダーを渡す必要があります。
import requests
# Expedia's search UI calls internal endpoints, not a public API
resp = requests.get(
"https://www.expedia.com/api/hotels/search",
params={"destination": "New York", "checkIn": "2026-09-10", "checkOut": "2026-09-12"},
headers={"User-Agent": "Mozilla/5.0 (compatible; research-bot/1.0)"},
)
デモは動きますが、その後破綻します。
- ソフトなブロックではなく、本物のアンチボット。 Expedia は検索ページと物件ページの前面に Akamai クラスのボット防御を置いています。単純な HTTP クライアントはコンテンツの代わりにチャレンジやスカスカのレスポンスを受け取るため、リアルなヘッダーだけでなく実際のブラウザ(またはブラウザ相当のトランスポート)が必要です。
- セルフサービス型の公式 API がない。 Rapid API へのアクセスには承認済みのパートナーになる必要があります。これは申請、審査プロセス、そして商用関係であり、リサーチやモニタリング用途向けのサインアップフォームではありません。
- 内部エンドポイントはドリフトする。 ドキュメント化されていないリクエスト形式やパラメータは予告なく変更されるため、今日のレスポンスに合わせて調整したスクレイパーは次回のフロントエンド更新で壊れます。
- 強く防御されたサイトでの信頼性は時間とともに変わる。 ヘッダーがうまく機能していても、これほどアンチボットに力を入れているサイトはある月はきれいに通り、アンチボットのルールが変わると翌月にはブロックされることがあります。一度作って終わりではなく、モニタリングの予算を見込みましょう。
- 5つの異なる面、5つの異なる形。 ロケーション、プロパティ、アクティビティ、フライトはそれぞれ別々のレスポンス形状を持つ別々の製品です。すべてをカバーするには、1つではなく複数のインテグレーションが必要になります。
選択肢2: ノーコード/既製ツール
Expedia のホテル検索に特化したマーケットプレイスのスクレイパーアクターやビジュアル抽出ツールは存在し、単発の取得には向いていますが、DIY と同じアンチボットの脆さを引き継ぎ、同じツールでアクティビティやフライトまではカバーせず、製品パイプライン内でスケジュール実行するには扱いにくいものです。
選択肢3: 構造化された Expedia API
ホテル、アクティビティ、フライトを横断した繰り返し実行可能なワークフローには、Expedia スクレイピング API が正規化された JSON を返し、ブラウザ群もエンドポイントのリバースエンジニアリングも維持する必要がありません。目的地を region id に変換するには次のようにします。
curl -X POST https://api.crawlora.net/api/v1/expedia/locations/search \
-H "x-api-key: $CRAWLORA_API_KEY" \
-H "Content-Type: application/json" \
-d '{"term": "New York", "currency": "USD", "locale": "en_US"}'
ホテルを検索し、詳細・レビュー・アクティビティ・フライトを Python で取得します。
import requests
h = {"x-api-key": "YOUR_API_KEY", "Content-Type": "application/json"}
base = "https://api.crawlora.net/api/v1/expedia"
hotels = requests.post(f"{base}/properties/search", headers=h, json={
"destination": "New York", "check_in": "2026-09-10", "check_out": "2026-09-12",
"adults": 2, "rooms": 1, "page": 1, "page_size": 5, "currency": "USD", "locale": "en_US",
}).json()["data"]["properties"]
property_id = hotels[0]["id"]
detail = requests.post(f"{base}/properties/detail", headers=h, json={
"property_id": property_id, "check_in": "2026-09-10", "check_out": "2026-09-12",
"adults": 2, "currency": "USD", "locale": "en_US",
}).json()["data"]
reviews = requests.post(f"{base}/properties/reviews", headers=h, json={
"property_id": property_id, "check_in": "2026-09-10", "check_out": "2026-09-12",
}).json()["data"]["reviews"]
activities = requests.post(f"{base}/activities/search", headers=h, json={
"destination": "New York", "start_date": "2026-09-10", "end_date": "2026-09-17",
}).json()["data"]["activities"]
flights = requests.post(f"{base}/flights/search", headers=h, json={
"origin": "JFK", "destination": "LAX", "departure_date": "2026-09-10",
"return_date": "2026-09-17", "trip_type": "round_trip", "adults": 1, "cabin_class": "COACH",
}).json()["data"]["offers"]
ホテル検索のレスポンスはそのまま保存できる正規化された JSON です(表示しているフィールドは実際のもの。ドキュメントを確認してください)。
{
"code": 200,
"msg": "OK",
"data": {
"destination": "New York, New York, United States of America",
"check_in": "2026-09-10",
"check_out": "2026-09-12",
"page": 1,
"properties": [
{
"id": "17117062",
"name": "Example Hotel New York",
"url": "https://www.expedia.com/New-York-Hotels-Example-Hotel.h17117062.Hotel-Information",
"review_score": 8.8,
"review_count": 2140,
"review_title": "Excellent",
"price": "$1,386 total",
"strikeout_price": "$1,705",
"nightly_price": "$556 nightly",
"thumbnail_url": "https://images.trvl-media.com/lodging/17100000/17110000/17117100/17117062/example.jpg",
"badges": ["VIP Access", "Member Price $319 off"]
}
]
}
}
物件詳細(property_id 指定)には address、amenities、city、province、country_code、latitude/longitude、star_rating、vip_message が追加されます。properties/filters は目的地ごとの利用可能なフィルターセクション(価格帯、設備、並べ替えオプション)を返し、properties/reviews はレビューごとに reviewer_name、date、rating_label、message、verified を返します。activities/search はアクティビティごとに name、duration、review_score、price、free_cancellation を返します。flights/search はオファーごとに airline、route、departure_time/arrival_time、stops、duration_summary、price を返します。cabin_class は COACH、PREMIUM_ECONOMY、BUSINESS、FIRST のいずれかである必要があります。取得した物件・オファーごとに1行を保存し、スケジュールを組んで再実行し、価格と空室状況を追跡しましょう。
収集できるもの
公開されているロケーション、物件、運賃データです。ロケーション検索(region id、geo type、座標)、ホテル検索結果(id、名前、価格、1泊あたりの価格、レビュースコア、バッジ、サムネイル)、物件詳細(住所、設備、星評価、座標)、目的地の利用可能なフィルターと並べ替えオプション、宿泊者レビュー(レビュアー名、日付、評価、テキスト)、アクティビティ(名前、所要時間、価格、レビュースコア、キャンセルポリシー)、フライトのオファー(航空会社、路線、時刻、経由回数、価格)。あくまで公開されているリスティングとレビューのデータのみです。
制約
- 本物のアンチボット対応が必要。 Expedia の Akamai クラスの防御によって、単純な HTTP クライアントではコンテンツに確実に到達できません。ヘッダーだけでなく、ブラウザ相当のトランスポートを見込んでおく必要があります。
- セルフサービス型の公式 API がない。 Rapid API は商用関係を伴うパートナー向け製品であり、リサーチやモニタリング用途には向きません。
- 強く防御された対象での信頼性は変わりうる。 うまく機能しているインテグレーションでも監視は必要です。これほど強く防御されたサイトのアンチボットルールは時間とともに変化します。
- 価格は動的で日付に依存する。 1回のスナップショットは検索した日付、宿泊人数、キャビンクラスしかカバーしません。関心のある日付範囲ごとに再取得しましょう。
- 5つの別々の面。 ロケーション、プロパティ、アクティビティ、フライトはスキーマを共有していません。同じプラットフォーム内でも別々のインテグレーションとして扱いましょう。
- 公開データのみ。 これは公開されているリスティング情報を収集するものであり、実際の予約を完了させたり操作したりする手段では決してありません。
どこで使われるか
- ホテルの価格と空室状況のモニタリング — 時間の経過に伴う物件のレートと稼働状況を追跡できます。旅行・宿泊業界リサーチを参照してください。
- レビューと評判の分析 — 物件や目的地ごとに宿泊者のセンチメントを集計できます。レビュー・評判モニタリングを参照してください。
- 市場調査 — 目的地や路線についてホテル、アクティビティ、フライトの価格を組み合わせられます。市場調査を参照してください。
出典
収集を始める
まずは無料でお試しください: 任意の公開 URL を無料ウェブスクレイパーに通すか、アンチボットチェッカーでサイトがボットをブロックするかどうかを確認できます。サインアップ不要です。
ロケーション、プロパティ、アクティビティ、フライトの各エンドポイントをプレイグラウンドで試し、API ドキュメントでスキーマを確認し、料金をご覧ください。Expedia は世界最大級の OTA の一つです。Booking.com のスクレイピング方法は直接の競合をカバーし、Airbnb のスクレイピング方法は同じ旅行の民泊側をカバーします。あわせてウェブスクレイピングは合法かもご覧ください。
よくある質問
Expedia にはホテル・フライト検索用の公開 API がありますか?
Expedia Group は Rapid API という、自社の宿泊在庫を配信するための B2B パートナー向け製品を運営しています。アクセスにはケースバイケースで審査される商用パートナー契約が必要で、検索結果を読み取るだけの単純なセルフサービス型サインアップはなく、標準製品が想定する範囲ではフライト検索もカバーしていません。
Expedia をスクレイピングするのは合法ですか?
ホテル名、価格、レビュースコアといった公開されているリスティングの事実には著作権が及ばず、hiQ Labs v. LinkedIn は公開データへのアクセスが CFAA 違反にはならないと判断しました。ただし Expedia の利用規約は事前の明示的な許可なしの自動アクセスを禁止しているため、公開されている事実データにとどめ、レート制限を尊重し、ログインを決して回避しないでください。これは法的助言ではありません。具体的な用途については Expedia の利用規約を確認し、弁護士に相談してください。
なぜ Expedia への単純な HTTP リクエストは失敗するのですか?
Expedia は検索ページと物件ページの前面に Akamai クラスのアンチボット防御を置いています。単純な requests.get() の呼び出しは通常、実際のデータの代わりにチャレンジページやスカスカのレスポンスを返すため、DIY のスクレイピングにはリアルなヘッダーだけでなく、実際のブラウザまたはブラウザ相当のトランスポートが必要です。
構造化 API を使って Expedia からどんなデータを収集できますか?
ロケーション検索(region id、geo type、座標)、ホテル検索結果と詳細(価格、1泊あたりの価格、レビュースコア、設備、星評価)、利用可能なフィルターと並べ替えオプション、宿泊者レビュー、アクティビティ(名前、所要時間、価格、キャンセルポリシー)、フライトのオファー(航空会社、路線、時刻、経由回数、価格)です。いずれも公開されているリスティングとレビューのデータです。
Expedia のデータ API でフライトを検索するにはどうすればよいですか?
origin、destination、departure_date(任意で return_date)、trip_type、adults、cabin_class を flights/search エンドポイントに POST します。cabin_class は「economy」のようなフリーテキストではなく、COACH、PREMIUM_ECONOMY、BUSINESS、FIRST のいずれかである必要があります。
特定の Expedia 物件の詳細とレビューを取得するにはどうすればよいですか?
まず物件検索(またはロケーション検索)を実行して property_id を取得し、その property_id と check_in/check_out の日付を properties/detail と properties/reviews の各エンドポイントに渡すことで、住所、設備、星評価、宿泊者レビューのテキストを取得できます。
スクレイピングした Expedia のデータを使って予約を作成・操作できますか?
できません。このデータは公開されているリスティング、価格、レビューのリサーチ用です。価格モニタリング、レートパリティチェック、市場調査、旅程プランニング製品などに使えますが、実際の予約を完了・変更したり、それに干渉したりする手段ではありません。