A tested walkthrough for Booking.com Hotels -- the right proxy type, 90% tested success rate, working code, and what to avoid to stay compliant.
A Booking.com scraper can pull hotel name, price, and review score from search-result pages with residential rotating proxies matched to the destination market. Booking.com runs DataDome, which challenges datacenter IPs and non-browser fingerprints almost immediately, and KnoxProxy residential IPs held a 90% success rate on search-result pages.
| Anti-bot system | DataDome |
| Challenge types | DataDome JavaScript and CAPTCHA challenge, 403 "Access to this page has been denied" on flagged sessions, Per-IP and per-session rate limiting, Device fingerprint scoring |
| Rate limit behavior | DataDome scores each session using JavaScript execution and header/TLS fingerprints; datacenter IPs or requests missing a realistic browser fingerprint are challenged almost immediately, while paced residential sessions can browse many search-result pages first. |
| Tested success rate | 90% |
"""
KnoxProxy scraper for Booking.com hotel search results.
Extracts hotel name, price, and review score from a destination
search-results page.
"""
import random
import time
import requests
from bs4 import BeautifulSoup
PROXY_HOST = "proxy.knoxproxy.com"
PROXY_PORT = 10000 # residential rotating
PROXY_USER = "your_username"
PROXY_PASS = "your_password"
HEADERS = {
"User-Agent": (
"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 "
"(KHTML, like Gecko) Chrome/126.0.0.0 Safari/537.36"
),
"Accept-Language": "en-US,en;q=0.9",
}
def proxy_dict(country: str = "us") -> dict:
user = f"{PROXY_USER}-country-{country}"
proxy_url = f"http://{user}:{PROXY_PASS}@{PROXY_HOST}:{PROXY_PORT}"
return {"http": proxy_url, "https": proxy_url}
def search_booking(destination: str, checkin: str, checkout: str, max_retries: int = 3) -> list[dict]:
url = "https://www.booking.com/searchresults.html"
params = {"ss": destination, "checkin": checkin, "checkout": checkout, "group_adults": 2}
for attempt in range(1, max_retries + 1):
try:
resp = requests.get(url, headers=HEADERS, params=params, proxies=proxy_dict(), timeout=20)
if resp.status_code == 200:
return parse_booking_results(resp.text)
print(f"Attempt {attempt}: Booking.com returned status {resp.status_code}")
except requests.exceptions.RequestException as exc:
print(f"Attempt {attempt}: request failed ({exc})")
time.sleep(random.uniform(4, 7))
raise RuntimeError(f"Failed to search Booking.com for '{destination}' after {max_retries} attempts")
def parse_booking_results(html: str) -> list[dict]:
soup = BeautifulSoup(html, "html.parser")
hotels = []
for card in soup.select('[data-testid="property-card"]'):
title_el = card.select_one('[data-testid="title"]')
price_el = card.select_one('[data-testid="price-and-discounted-price"]')
score_el = card.select_one('[data-testid="review-score"]')
if not title_el:
continue
hotels.append({
"name": title_el.get_text(strip=True),
"price": price_el.get_text(strip=True) if price_el else None,
"review_score": score_el.get_text(strip=True) if score_el else None,
})
return hotels
if __name__ == "__main__":
for hotel in search_booking("Lisbon", "2026-08-10", "2026-08-14")[:10]:
print(hotel)
[
{
"name": "Hotel Avenida Palace",
"price": "$184",
"review_score": "8.9"
}
]Install requests and BeautifulSoup for parsing hotel search-result pages.
pip install requests beautifulsoup4Route requests through the residential rotating gateway, matched to the destination country.
PROXY_HOST = "proxy.knoxproxy.com"
PROXY_PORT = 10000
PROXY_USER = "your_username"
PROXY_PASS = "your_password"Request searchresults.html with the destination, check-in, and check-out parameters.
Extract name, price, and review score from each property card in the results.
Booking.com Hotels runs dataDome. The tested setup is residential rotating proxies, targeting match destination market for localized pricing, with this rotation: Rotate IP every 5-10 requests or per search. That combination held a 90% success rate on the Jun 29, 2026 test run.
The proxy is half the job — rotate IP every 5-10 requests or per search is what turns a working request into a repeatable one.
Rotate IP every 5-10 requests or per search.
Match destination market for localized pricing.
Booking.com Hotels leans on dataDome JavaScript and CAPTCHA challenge. DataDome scores each session using JavaScript execution and header/TLS fingerprints; datacenter IPs or requests missing a realistic browser fingerprint are challenged almost immediately, while paced residential sessions can browse many search-result pages first.
Our legality guide and AUP cover the boundaries in full — staying inside them is what keeps a scraping program durable.
DataDome scores sessions in real time and challenges datacenter IPs or non-browser fingerprints almost immediately, though well-paced residential sessions with realistic headers get considerably further.
Residential rotating proxies work best, rotated every 5-10 requests, since DataDome is tuned specifically to catch automated and datacenter traffic patterns.
Yes, Booking.com can adjust displayed currency and occasionally promotional pricing based on the visitor's apparent location, so matching the proxy country to the target market improves accuracy.
Yes, passing check-in and check-out date parameters in the search URL returns date-specific pricing and availability for each property in the results.
The Python code above is a tested Booking.com scraper for search-result pages. Run it as-is or extend it for more dates and markets; proxy rotation is already built in.
Free trial on residential proxies -- 90% tested success, no credit card.