Tony Wang5 分で読めますBooking.com のスクレイピング方法(2026年版・API & Python)
2026年に Booking.com をスクレイピングする方法 — ホテル検索、詳細、レビュー、フライト、アクティビティ — DIY、ノーコード、構造化 API と、法律上の基本を解説します。
2026年に Booking.com をスクレイピングする最も手早い方法は、Booking.com 独自の persisted-query GraphQL や内部 REST エンドポイントを自分でリプレイするのではなく、正規化された JSON を返す構造化 API を呼び出すことです。返ってくるのは、ホテル検索、詳細、宿泊者レビュー、フライトのオファー、アクティビティです。Booking.com はトラフィック規模で最大の OTA ですが、その公式 API はパートナー限定であり、ページは実際のアンチボット防御の背後で動いています。このガイドでは3つの面すべて(ホテル、フライト、アクティビティ)にわたって3つのアプローチを取り上げ、DIY がどこで破綻するか、そして法律上の基本を解説します。
なぜ Booking.com をスクレイピングするのか?
Booking.com のホテル、フライト、アクティビティのデータは次のような用途を支えます。
- ホテルの価格と空室状況のモニタリング — 物件のレートが日付、部屋タイプ、シーズンによってどう動くかを追跡できます。
- 競合レートのリサーチ — あるホテルの Booking.com での価格を他のチャネルと比較できます。
- レビューと評判の分析 — ホテル、日付、旅行者タイプごとに宿泊者のレビュースコアとテキストを集計できます。
- 航空券の運賃リサーチ — 目的地についてホテル価格と合わせて、路線・日付ごとの運賃の動きを追跡できます。
- 目的地とアクティビティの発見 — 旅程プランニングやイティネラリー製品向けに見どころやアクティビティを提示できます。
Booking.com をスクレイピングするのは合法か?
選択肢1: Python で DIY する(そしてなぜ破綻するか)
Booking.com のホテルページは単純な HTML ではなく persisted-query の GraphQL 呼び出しからレンダリングされるため、DIY のスクレイパーはそれらのクエリを再現します。
import requests
# Booking.com's search UI calls a persisted-query GraphQL endpoint
resp = requests.post(
"https://www.booking.com/dml/graphql",
json={"operationName": "SearchResults", "variables": {"destination": "Tokyo"}, "extensions": {"persistedQuery": {"sha256Hash": "..."}}},
headers={"User-Agent": "Mozilla/5.0 (compatible; research-bot/1.0)"},
)
デモは動きますが、その後破綻します。
- ソフトなブロックではなく、本物のアンチボット。 Booking.com は検索ページとホテル詳細ページの前面に JavaScript チャレンジのシェルを置いています。単純な HTTP クライアントはコンテンツの代わりにチャレンジページを受け取るため、リアルなヘッダーだけでなく実際のブラウザ(またはブラウザ相当のトランスポート)が必要です。
- セルフサービス型の公式 API がない。 実際の Demand API へのアクセスには承認済みのアフィリエイトパートナーになる必要があります。これは申請、承認プロセス、そして予約ごとの手数料というビジネス関係であり、リサーチやモニタリング用途向けのサインアップフォームではありません。
- Persisted-query のドリフト。 JustWatch と同様に、GraphQL クエリはハッシュ化されバージョン管理されているため、Booking.com が新しいハッシュを出すと再現したクエリは壊れます。
- 3つの異なる面、3つの異なる形。 ホテル、フライト、アクティビティは別々のエンドポイントと別々のレスポンス形状を持つ別々の製品です。3つすべてをカバーするには、1つではなく3つのインテグレーションが必要になります。
選択肢2: ノーコードツール
Booking.com のホテル検索に特化したマーケットプレイスのスクレイパーアクターは存在し、単発の取得には向いていますが、DIY と同じアンチボットと persisted-query の脆さを引き継ぎ、同じツールでフライトやアクティビティまではカバーしません。
選択肢3: 構造化された Booking.com API
3つの面すべてにわたる繰り返し実行可能なワークフローには、Booking.com スクレイピング API が正規化された JSON を返し、ブラウザ群も persisted-query のメンテナンスも不要です。目的地と日付でホテルを検索するには次のようにします。
curl "https://api.crawlora.net/api/v1/booking/search?query=Tokyo&checkin=2026-09-10&checkout=2026-09-14&adults=2" \
-H "x-api-key: $CRAWLORA_API_KEY"
ホテルの詳細とレビュー、さらにフライトとアクティビティの検索を Python で取得します。
import requests
h = {"x-api-key": "YOUR_API_KEY"}
base = "https://api.crawlora.net/api/v1"
hotels = requests.get(f"{base}/booking/search", headers=h, params={
"query": "Tokyo", "checkin": "2026-09-10", "checkout": "2026-09-14", "adults": 2,
}).json()["data"]["properties"]
hotel_id = hotels[0]["id"]
detail = requests.get(f"{base}/booking/hotel-detail", headers=h, params={"hotel_id": hotel_id}).json()["data"]
reviews = requests.get(f"{base}/booking/reviews", headers=h, params={"hotel_id": hotel_id, "hotel_country_code": "jp", "limit": 20}).json()["data"]
flights = requests.get(f"{base}/booking-flights/search", headers=h, params={
"from": "NRT", "to": "LAX", "depart": "2026-09-10",
}).json()["data"]
attractions = requests.get(f"{base}/booking-attractions/search", headers=h, params={
"query": "Tokyo", "start_date": "2026-09-10",
}).json()["data"]
ホテル検索結果は正規化された JSON です(実際のフィールド。ドキュメントを確認してください)。
{
"code": 200,
"msg": "OK",
"data": {
"destination": "Tokyo",
"results_count": 1842,
"properties": [
{
"id": 201234,
"slug": "example-hotel-tokyo",
"name": "Example Hotel Tokyo",
"location": "Shinjuku, Tokyo",
"star_rating": 4,
"review_score": 8.6,
"review_count": 3120,
"price": 148,
"currency": "USD",
"url": "https://www.booking.com/hotel/jp/example-hotel-tokyo.html"
}
]
}
}
ホテル詳細には rooms、facilities、highlights、house_rules、rating_scores(清潔さ・立地・コストパフォーマンスといったカテゴリー別の内訳)が追加されます。レビューはレビューごとに positive_text/negative_text、score、stay_status、room_type、reviewer_country を返します。取得したホテル・日付ごとに1行を保存し、スケジュールを組んで再実行し、価格と空室状況を追跡しましょう。
収集できるもの
公開されているホテルデータです。検索結果(id、名前、場所、星評価、レビュースコア、価格)、ホテル詳細(部屋、設備、ハイライト、ハウスルール、評価の内訳、写真)、宿泊者レビュー(スコア、ポジティブ/ネガティブなテキスト、宿泊日、旅行者タイプ、国)。フライトデータでは、路線・日付ごとの運賃オファー、出発地/目的地のオートコンプリート。アクティビティデータでは、目的地・日付によるアクティビティ検索、商品詳細、レビュー。あくまで公開されているリスティングとレビューのデータのみです。
制約とよくある課題
- 本物のアンチボット対応が必要。 Booking.com の JS チャレンジのシェルによって、単純な HTTP クライアントではコンテンツに到達できません。ヘッダーだけでなく、ブラウザ相当のトランスポートを見込んでおく必要があります。
- セルフサービス型の公式 API がない。 Demand API はアフィリエイトパートナー限定で手数料関係が伴うため、リサーチやモニタリング製品には向きません。
- レートは日付、部屋タイプ、宿泊人数によって変わる。 1回のスナップショットは検索した日付と人数の組み合わせしかカバーしません。関心のある日付範囲ごとに再取得しましょう。
- 3つの別々の面。 ホテル、フライト、アクティビティは id もスキーマも共有していません。同じプラットフォーム内でも3つのインテグレーションとして扱いましょう。
- 公開データのみ。 これは公開されているリスティング情報を収集するものであり、実際の予約を完了させたり操作したりする手段では決してありません。
どこで使われるか
- ホテルの価格と空室状況のモニタリング — 時間の経過に伴う物件のレートと稼働状況を追跡できます。
- レビューと評判の分析 — ホテルや目的地ごとに宿泊者のセンチメントを集計できます。
- 旅程プランニングとイティネラリーツール — 1つの目的地についてホテル、フライト、アクティビティのデータを組み合わせられます。
出典
収集を始める
まずは無料でお試しください: 任意の公開 URL を無料ウェブスクレイパーに通すか、アンチボットチェッカーでサイトがボットをブロックするかどうかを確認できます。サインアップ不要です。
検索とホテル詳細のエンドポイントをプレイグラウンドで試し、API ドキュメントでスキーマを確認し、料金をご覧ください。Booking.com は宿泊先をカバーしますが、Airbnb のスクレイピング方法は同じ旅行の民泊側をカバーし、TripAdvisor のスクレイピング方法はレビュー起点の切り口でホテル、アクティビティ、旅行者レビューをカバーします。あわせてウェブスクレイピング API の選び方とウェブスクレイピングは合法かもご覧ください。
よくある質問
Booking.com に公式 API はありますか?
はい、Demand API があります。ただし承認済みのアフィリエイトパートナー限定で、予約ごとの手数料というビジネス関係が前提です。リサーチや価格モニタリング用途のセルフサービス型サインアップではありません。そうした用途には構造化スクレイピング API が現実的な手段です。
Booking.com のスクレイピングは合法ですか?
ホテル名、価格、星評価、レビュースコアといった公開されているリスティングの事実には著作権が及びませんが、Booking.com の利用規約は自動データ抽出を禁止しています。公開されているリスティングとレビューの事実にとどめ、レート制限を尊重し、ログインを決して回避せず、スクレイピングしたデータで予約を作成・操作しようとしないでください。法的助言ではありません。
ブロックされずに Booking.com をスクレイピングできますか?
Booking.com はページの前面に JavaScript チャレンジのシェルを置いているため、単純な HTTP クライアントではコンテンツに到達できません。リアルなヘッダーだけでなく、ブラウザ相当のトランスポートが必要です。構造化 API はこれを1つの API キーの裏側で処理します。
ホテルの客室とレビューはどうやって取得しますか?
検索してホテルの id を取得し、/booking/hotel-detail で客室・設備・評価の内訳を、/booking/reviews で個々の宿泊者レビュー(スコア、ポジティブ/ネガティブなテキスト、宿泊日、旅行者タイプ、国)を取得します。
ホテルだけでなくフライトやアクティビティも検索できますか?
はい。/booking-flights/search は路線・日付ごとの運賃オファーを返し(空港を解決する /booking-flights/autocomplete もあります)、/booking-attractions/search は目的地・日付範囲ごとのアクティビティを返します。個々の商品には /booking-attractions/detail と /booking-attractions/reviews を使います。
ホテルの価格はどのくらいの頻度で変わりますか?
レートは日付、部屋タイプ、宿泊人数によって変動するため、1回の検索はリクエストした人数と日付の組み合わせしか反映しません。関心のある日付範囲ごとに再取得し、スケジュールを組んで再実行し、空室状況と価格の動きを追跡してください。
Booking.com からどんなデータを収集できますか?
公開されているホテルデータ(検索、詳細、客室、設備、評価の内訳)、宿泊者レビュー、フライトの運賃オファー、レビュー付きのアクティビティ一覧です。あくまで公開データのみで、完了・操作された予約情報は含まれません。