Tutorial

How to Scrape Booking.com Data in 2026

|11 min read

Booking.com lists over 28 million accommodation options worldwide. Scraping hotel pricing, availability, and review data powers travel analytics, price comparison tools, and competitive monitoring for the hospitality industry.

Why scrape Booking.com?

Booking.com data drives travel and hospitality intelligence:

1

Hotel pricing

Monitor nightly rates across destinations, dates, and room types. Build dynamic pricing models for your own properties.

2

Availability monitoring

Track room availability and sellout patterns. Identify high-demand periods and pricing opportunities.

3

Travel data analysis

Analyze guest reviews, amenity trends, and destination popularity. Build data products for the travel industry.

Method 1: DIY scraping

Booking.com renders search results server-side with data-testid attributes, making selectors relatively stable. However, anti-bot protections are among the strongest in the travel industry.

scraper.py
#E8A0BF">import requests
#E8A0BF">from bs4 #E8A0BF">import BeautifulSoup

headers = {
    #A8D4A0">"User-Agent": #A8D4A0">"Mozilla/5.0 (Windows NT 10.0; Win64; x64) "
                   #A8D4A0">"AppleWebKit/537.36 Chrome/124.0.0.0 Safari/537.36"
}

# Booking.com search results #E8A0BF">for New York hotels
url = #A8D4A0">"https://www.booking.com/searchresults.html?ss=New+York&checkin=2026-05-01&checkout=2026-05-03"
resp = requests.#87CEEB">get(url, headers=headers)
soup = BeautifulSoup(resp.#87CEEB">content, #A8D4A0">"html.parser")

# Extract hotel cards
hotels = soup.#87CEEB">select(#A8D4A0">"[data-testid=#A8D4A0">'property-card']")
#E8A0BF">for hotel in hotels[:10]:
    name = hotel.#87CEEB">select_one(#A8D4A0">"[data-testid=#A8D4A0">'title']")
    price = hotel.#87CEEB">select_one(#A8D4A0">"[data-testid=#A8D4A0">'price-and#FFB347">-discounted-price']")
    score = hotel.#87CEEB">select_one(#A8D4A0">"[data-testid=#A8D4A0">'review-score']")
    #E8A0BF">print(f#A8D4A0">"Hotel: {name.#87CEEB">text.strip() #E8A0BF">if name #E8A0BF">else #A8D4A0">'N/A'}")
    #E8A0BF">print(f#A8D4A0">"Price: {price.#87CEEB">text.strip() #E8A0BF">if price #E8A0BF">else #A8D4A0">'N/A'}")
    #E8A0BF">print(f#A8D4A0">"Score: {score.#87CEEB">text.strip() #E8A0BF">if score #E8A0BF">else #A8D4A0">'N/A'}")
    #E8A0BF">print(#A8D4A0">"---")

Pain points

  • !Booking.com uses Cloudflare and custom bot detection — simple HTTP requests rarely work
  • !Prices are dynamic and change based on session, cookies, and detected location
  • !Rate limiting is extremely aggressive — IPs get blocked within a handful of requests
  • !Search results require specific check-in/check-out dates, adding URL complexity
  • !Some pricing data loads asynchronously via JavaScript after initial page render
  • !European operations mean GDPR compliance is a concern when scraping guest reviews

Method 2: SnapRender API

SnapRender handles Cloudflare bypass and browser rendering in one call. Use /render for markdown or /extract for structured JSON.

Render as markdown

Get search results as markdown for travel data analysis.

render.py
#E8A0BF">import requests

# Render Booking.com search results #E8A0BF">as markdown
render = requests.#87CEEB">post(
    #A8D4A0">"https://api.snaprender.dev/v1/render",
    headers={#A8D4A0">"x-api-key": #A8D4A0">"sr_live_YOUR_KEY"},
    json={
        #A8D4A0">"url": #A8D4A0">"https://www.booking.com/searchresults.html?ss=New+York&checkin=2026-05-01&checkout=2026-05-03",
        #A8D4A0">"format": #A8D4A0">"markdown",
        #A8D4A0">"use_flaresolverr": #E8A0BF">True
    }
)
#E8A0BF">print(render.#87CEEB">json()[#A8D4A0">"data"][#A8D4A0">"markdown"])

Extract structured data

Pull hotel names, prices, and scores with CSS selectors.

extract.py
#E8A0BF">import requests

# Extract structured hotel data
extract = requests.#87CEEB">post(
    #A8D4A0">"https://api.snaprender.dev/v1/extract",
    headers={#A8D4A0">"x-api-key": #A8D4A0">"sr_live_YOUR_KEY"},
    json={
        #A8D4A0">"url": #A8D4A0">"https://www.booking.com/searchresults.html?ss=New+York&checkin=2026-05-01&checkout=2026-05-03",
        #A8D4A0">"use_flaresolverr": #E8A0BF">True,
        #A8D4A0">"selectors": {
            #A8D4A0">"names": #A8D4A0">"[data-testid=#A8D4A0">'title']",
            #A8D4A0">"prices": #A8D4A0">"[data-testid=#A8D4A0">'price-and#FFB347">-discounted-price']",
            #A8D4A0">"scores": #A8D4A0">"[data-testid=#A8D4A0">'review-score']",
            #A8D4A0">"locations": #A8D4A0">"[data-testid=#A8D4A0">'address']"
        }
    }
)
#E8A0BF">print(extract.#87CEEB">json())

Example response

response.json
{
  #A8D4A0">"status": #A8D4A0">"success",
  #A8D4A0">"data": {
    #A8D4A0">"names": [#A8D4A0">"The Pierre, A Taj Hotel", #A8D4A0">"Park Hyatt New York", #A8D4A0">"..."],
    #A8D4A0">"prices": [#A8D4A0">"$489", #A8D4A0">"$612", #A8D4A0">"..."],
    #A8D4A0">"scores": [#A8D4A0">"9.2 Wonderful", #A8D4A0">"9.0 Wonderful", #A8D4A0">"..."],
    #A8D4A0">"locations": [#A8D4A0">"Upper East Side, Manhattan", #A8D4A0">"Midtown, Manhattan", #A8D4A0">"..."]
  },
  #A8D4A0">"url": #A8D4A0">"https://www.booking.com/searchresults.html?ss=New+York",
  #A8D4A0">"elapsed_ms": 4250
}

Legal considerations

Key legal points for scraping Booking.com:

  • 1.Booking.com's Terms of Service explicitly prohibit automated scraping and data extraction.
  • 2.Booking.com is headquartered in the Netherlands — European data protection law (GDPR) applies. Guest reviews may contain personal data.
  • 3.The EU Database Directive may protect Booking.com's compiled hotel and pricing data as a database right.
  • 4.Booking.com has pursued legal action against price comparison sites that scraped their data without permission.
  • 5.Rate-limit aggressively, never scrape guest personal data, and consult a lawyer familiar with both US and EU law.

Start free — 100 requests/month

Get your API key in 30 seconds. Scrape Booking.com data with five lines of code. No credit card, no browser fleet, no proxy bills.

Get Your API Key

Frequently asked questions

Booking.com's Terms of Service prohibit scraping and automated access. They have pursued legal action against scrapers in European courts. The hiQ v. LinkedIn ruling applies primarily in the US. European GDPR adds additional restrictions on data collection. Always consult a lawyer before scraping Booking.com.

Booking.com uses Cloudflare protection, aggressive rate limiting, browser fingerprinting, CAPTCHA challenges, and IP reputation scoring. They also detect patterns like date-range sweeping and geographic anomalies. SnapRender's use_flaresolverr flag handles Cloudflare and browser detection automatically.

Hotel names, prices, ratings, review scores, availability, amenities, room types, location data, and guest review text. SnapRender's /extract endpoint targets any of these with CSS selectors.

SnapRender starts free with 100 requests/month. Paid plans begin at $9/month for 1,500 requests. Each Booking.com page is one request — no credit multipliers.