Guides / Scrape Booking.com

How to Scrape Booking.com in 2026

Booking.com uses advanced anti-bot protection, dynamic pricing that changes based on visitor behavior, and JavaScript-rendered search results. With Browser7, you get fully rendered hotel search pages in a single API call - including property cards, ratings, and review counts.

What makes Booking.com hard to scrape

Advanced anti-bot protection

Booking.com uses multiple layers of bot detection including browser fingerprinting, behavioral analysis, and CAPTCHA challenges. Datacenter IPs are blocked almost immediately, and automated browsers are detected through their JavaScript execution patterns.

Dynamic pricing

Prices on Booking.com change based on demand, your location, browsing history, and time of day. This means the data you see depends on how your request appears to their servers, making consistent data collection challenging.

JavaScript-rendered results

Search results, property cards, and pricing data are all rendered via JavaScript. A simple HTTP request returns a page shell without the actual hotel listings. Full browser execution is required to get the real data.

Geo-targeted content

Booking.com serves different results, prices, and availability based on the visitor's geographic location. This means you need control over which country your request appears to come from.

Scrape Booking.com hotel search results

Browser7 handles proxy rotation, browser fingerprinting, CAPTCHA solving, and JavaScript rendering automatically. This example scrapes hotel search results for New York and returns the fully rendered HTML with all property cards.

from browser7 import Browser7

client = Browser7(
    api_key="b7_your_api_key",
    base_url="https://ca-api.browser7.com/v1"
)

result = client.render(
    "https://www.booking.com/searchresults.html?ss=New+York",
    country_code="US",
)

print(result.html)

That is the complete code. No proxy configuration, no browser setup, no CAPTCHA handling logic. The response contains the fully rendered HTML of the Booking.com search results page, including all property cards with hotel names, ratings, and review counts.

Data you can extract

The rendered HTML contains all the data Booking.com shows to a real visitor on search results pages. Common data points to extract:

Hotel details

  • Hotel name and star rating
  • Property type (hotel, apartment, etc.)
  • Address and neighborhood
  • Distance from city center
  • Link to full property page

Pricing

  • Nightly rate
  • Total price for stay
  • Taxes and fees breakdown
  • Discount badges
  • Free cancellation availability

Reviews

  • Review score (out of 10)
  • Review count
  • Rating category (Superb, Good, etc.)
  • Category scores
  • Guest sentiment highlights

Location

  • Map coordinates
  • Nearby attractions
  • Transit distance
  • Beach/ski distance
  • Neighborhood description

Complete example: render and parse hotel listings

Here is a complete example that renders a Booking.com search page and extracts structured data from the HTML. The Python example uses BeautifulSoup, Node.js uses Cheerio, and PHP uses DOMDocument - the standard HTML parsing approach for each language.

from browser7 import Browser7
from bs4 import BeautifulSoup
import json
import re

client = Browser7(
    api_key="b7_your_api_key",
    base_url="https://ca-api.browser7.com/v1"
)

result = client.render(
    "https://www.booking.com/searchresults.html?ss=New+York",
    country_code="US",
)

soup = BeautifulSoup(result.html, "html.parser")

hotels = []
for card in soup.select('div[data-testid="property-card"]'):
    hotel = {
        "name": None,
        "rating": None,
        "review_count": None,
    }

    title = card.select_one('div[data-testid="title"]')
    if title:
        hotel["name"] = title.get_text(strip=True)

    score = card.select_one('div[data-testid="review-score"]')
    if score:
        text = score.get_text(strip=True)
        match = re.search(r'Scored ([\d.]+)', text)
        if match:
            hotel["rating"] = match.group(1)
        count_match = re.search(r'([\d,]+) review', text)
        if count_match:
            hotel["review_count"] = int(count_match.group(1).replace(",", ""))

    hotels.append(hotel)

print(json.dumps(hotels[:5], indent=2))

CSS selectors may change if Booking.com updates their page structure. Inspect the current page if any fields return null.

Sample output:

[
  {
    "name": "The Manhattan Club",
    "rating": "8.2",
    "review_count": 3241
  },
  {
    "name": "Pod Times Square",
    "rating": "7.9",
    "review_count": 5872
  },
  ...
]

Scrape page 2 and beyond

Booking.com uses the &offset= parameter for pagination. Each page shows 25 results, so page 2 is &offset=25, page 3 is &offset=50, and so on.

from browser7 import Browser7
from bs4 import BeautifulSoup

client = Browser7(
    api_key="b7_your_api_key",
    base_url="https://ca-api.browser7.com/v1"
)

# Page 2: add &offset=25 (25 results per page)
result = client.render(
    "https://www.booking.com/searchresults.html?ss=New+York&offset=25",
    country_code="US",
)

soup = BeautifulSoup(result.html, "html.parser")
for card in soup.select('div[data-testid="property-card"]'):
    title = card.select_one('div[data-testid="title"]')
    if title:
        print(title.get_text(strip=True))

Take a screenshot of search results

Capture Booking.com search results as images for price monitoring dashboards, competitive analysis reports, or tracking hotel availability over time.

import base64
from browser7 import Browser7

client = Browser7(
    api_key="b7_your_api_key",
    base_url="https://ca-api.browser7.com/v1"
)

result = client.render(
    "https://www.booking.com/searchresults.html?ss=New+York",
    country_code="US",
    block_images=False,
    include_screenshot=True,
    screenshot_full_page=True,
    screenshot_format="png"
)

# Save the screenshot
with open("booking-search.png", "wb") as f:
    f.write(base64.b64decode(result.screenshot))

print("Screenshot saved")

What this costs

Every Booking.com page render costs $0.01 - the same as any other website. Residential proxies, JavaScript rendering, CAPTCHA solving, and screenshots are all included. There are no per-domain surcharges, no credit multipliers, and no bandwidth fees.

10,000 Booking.com search pages costs $100. You know this before you start, not after.

Try it yourself

100 free renders - enough to test Booking.com scraping with no payment required.