← All articles

Tutorials

How to Scrape Booking.com: Hotel Prices and Availability

Daniel K. · August 1, 2026 · 9 min read


Booking.com is the largest accommodation marketplace on the web, which makes it the reference source for hotel pricing, availability and guest sentiment. It is also heavily defended, and it has one property that catches most people out: the price you see depends on where you appear to be browsing from. That single fact changes how you have to build the scraper.

Set Expectations First

This is not a requests.get() target. Expect:

Booking.com also runs an official Partner / Affiliate API for approved partners. If your use case fits it, it is far more stable and lower risk than scraping. Check that first.

What a Listing Exposes

Guest reviews carry reviewer names and nationalities — that is personal data, and it changes your obligations. More on that below.

The Part Most Guides Miss: Price Varies by Visitor Country

Travel platforms routinely localise pricing presentation — currency, tax display, regional promotions and available rate plans can all differ depending on where the visitor appears to be. Scraping Booking.com from a single datacenter IP in one country therefore gives you one market's view, not the market.

If you are doing rate-parity checks, competitive pricing, or building a fare aggregator, you need to collect the same property and dates from multiple countries. That means residential proxies with country targeting — not as an anti-blocking measure, but because the country is a variable in your dataset. It is the same requirement behind travel fare aggregation.

The Setup That Works

A real browser plus country-matched residential exits:

from playwright.sync_api import sync_playwright

ENDPOINT = "geo.spyderproxy.com:12321"

def fetch(url, country="gb", locale="en-GB"):
    proxy = {"server": f"http://{ENDPOINT}",
             "username": f"USERNAME-country-{country}", "password": "PASSWORD"}
    with sync_playwright() as p:
        browser = p.chromium.launch(headless=True, proxy=proxy)
        ctx = browser.new_context(locale=locale)
        page = ctx.new_page()
        page.goto(url, wait_until="networkidle", timeout=60000)
        page.wait_for_timeout(2500)          # let prices settle
        html = page.content()
        browser.close()
        return html

Set the country in your proxy username (your dashboard shows the exact format) and keep the browser locale consistent with it — a UK IP paired with a US locale is an obvious mismatch. Then crawl in two phases: collect property URLs from paginated search results, then visit each property. That is the list crawling pattern.

One deliberate omission: no CSS selectors here. Booking.com's class names are generated and rotate; anything printed today would be wrong within weeks. Inspect the live page and anchor on stable attributes or text landmarks. Where the page embeds JSON-LD, parse that instead of the DOM — it is far more durable.

Collecting at Scale Without Getting Blocked

Store results as JSON to keep the nested room/rate structure, or flatten for analysis (JSON vs CSV).

Educational, not legal advice — see is web scraping legal, and get proper advice for a commercial build. The general rules in web scraping best practices apply throughout.

What Teams Build With It

Frequently Asked Questions

Can you scrape Booking.com?

Technically yes, but not with simple HTTP requests. Booking.com uses bot protection and renders prices client-side, so a reliable scraper needs a headless browser such as Playwright routed through rotating residential proxies. Check whether their official Partner or Affiliate API covers your use case first, as it is more stable and lower risk.

Why do Booking.com prices change depending on the proxy country?

Travel platforms localise pricing presentation — currency, tax display, regional promotions and available rate plans can differ by the visitor's apparent location. If you scrape from one country you capture one market's view. For rate parity or competitive pricing you need country-targeted residential IPs so the market becomes a controlled variable in your dataset.

Is scraping Booking.com legal?

Collecting public data is broadly permitted in many jurisdictions, but Booking.com's Terms of Service restrict automated access, and guest reviews contain personal data governed by the GDPR as well as being copyrighted by their authors. Stay on public pages, never log in, prefer aggregate review scores over storing individual reviews, and take legal advice for commercial use.

What data can you extract from Booking.com?

Public listings typically expose the property name, star rating and type, nightly price for the searched dates plus taxes and fees, availability and scarcity messaging, review score and count, location and distance from the centre, amenities, cancellation policy and room configuration.

Conclusion

Scraping Booking.com is an advanced job with one twist that defines the architecture: price depends on where you appear to browse from. Use a headless browser for the rendering, country-targeted residential IPs so geography becomes a deliberate variable rather than an accident, stable-attribute parsing that survives redesigns, tight date and city scoping, and a careful line on reviews and personal data.

Collect hotel pricing from any market: SpyderProxy residential proxies from $2.75/GB — country and city targeting across 195+ countries.

Ready to collect data without getting blocked?

Start now ↗