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.