---
title: "Travel data scraping"
description: "Travel data scraping for airfares, hotel rates, car hire quotes, tours and reviews from airlines, OTAs like Booking.com and Kayak, Klook and Tripadvisor."
canonical: https://www.zenrows.com/use-cases/travel-data-scraping
updated: 2026-10-18
---

# Travel data scraping

Travel data scraping collects prices, availability and reviews from airlines, online travel agencies, hotel chains, car hire brokers and tour marketplaces. Zenrows runs the search a traveller would run, from the country you choose, through protected travel sites, and returns rendered pages, Markdown or structured JSON that you can store and compare per provider.

## Sample output: one car hire quote

```json
{
  "source": "car-hire-broker.example.com",
  "searched_at": "2026-10-17T06:15:00Z",
  "point_of_sale": "gb",
  "pickup": { "location": "Malaga Airport (AGP)", "datetime": "2026-11-14T10:00" },
  "dropoff": { "location": "Malaga Airport (AGP)", "datetime": "2026-11-21T10:00" },
  "vehicle": {
    "class": "Compact",
    "example_model": "VW Golf or similar",
    "transmission": "manual",
    "seats": 5
  },
  "supplier": "Example Car Rental",
  "supplier_rating": 8.1,
  "total_price": 214.6,
  "currency": "GBP",
  "price_per_day": 30.66,
  "mileage_limit_km": null,
  "fuel_policy": "full_to_full",
  "free_cancellation": true,
  "deposit": 950.0
}
```

An illustrative quote from a car hire search, priced for a UK visitor. The same shape works for a tour slot or a room rate: what was searched, from which market, and the price the site showed.

## What travel data teams collect

Travel prices only exist for a given search: a route or a city, a set of dates, a party size and a market. Every job below starts by deciding that search grid, then sends it to the sites that matter for the product.

| Job | Data you collect | Typical sources |
|---|---|---|
| [Airfare monitoring](/use-cases/scraping-flight-prices) | Fares by route and date, fare class, stops, baggage, award availability | Airline sites, Kayak, Google Flights, regional OTAs |
| [Hotel rate shopping](/use-cases/hotel-data-scraping) | Nightly rate by room type and check-in date, taxes, rooms left, parity across channels | Booking.com, Expedia, Agoda, Google Hotels, IHG, Accor |
| [Short-term rental analytics](/use-cases/short-term-rental-data) | Nightly rate, cleaning fee, calendar availability, reviews | Airbnb, Vrbo |
| Car hire pricing | Daily rate by vehicle class, supplier, deposit, fuel and cancellation terms | Rentalcars.com, broker sites, supplier sites |
| Tours and activities catalog | Product title, price per person, time slots, duration, inclusions | Klook, GetYourGuide, Viator, tour operator sites |
| Reviews and reputation | Score, review text, stay or trip date, management reply | Tripadvisor, HolidayCheck, Google, OTA review tabs |
| Destination content | Guides, opening hours, event listings for travel publishing | Lonely Planet, Time Out, Condé Nast Traveler, tourism boards |

## Why travel sites are hard to scrape

Travel sites price on demand. Most prices appear only after a search form runs, and airlines and large OTAs put bot management in front of that search to keep automated traffic off their booking engines.

| What breaks | What it looks like | How Zenrows handles it |
|---|---|---|
| Bot management on airlines and OTAs | The first requests work, then the search returns an access denied page for days | Zenrows' stealth gets through [Akamai](/bypass/akamai), DataDome and similar protections, with retries |
| Search-form-first pages | No price in the HTML until origin, destination and dates are filled and submitted | Fetch runs page actions (fill, click) before returning the page; [Browser](/products/browser) runs longer multi-step flows |
| Point-of-sale pricing | The same room or seat costs a different amount, in a different currency, by visitor country | Geotargeting sends each search from the market you are pricing |
| Prices loaded by XHR | The visible page is a shell and the fares arrive from a background JSON call | Fetch can capture the page's background network calls (XHR) and return the JSON they carried |
| Search grid volume | Routes times dates times party sizes turns a few markets into hundreds of thousands of searches | [Batch](/products/batch) runs the full grid as one job, results by webhook |
| Peak-season tightening | Protection can get stricter around holidays, when prices move most | Adaptive Stealth Mode escalates to browser rendering and stealth only when a page needs it, so your search grid does not change |

## How to scrape travel data with Zenrows

1. **Define the search grid.** List the providers, routes or cities, date pairs and markets you need. Each cell becomes one URL or one scripted search.
2. **Find the product pages.** On tour and hotel catalogs, use Crawl to collect every detail URL that matches a pattern such as `/activity/` or `/hotel/`.
3. **Fetch each search.** Send the URL with Adaptive Stealth Mode and geotargeting set to the market you price. Name the fields with CSS selectors, or let Extract return structured JSON.
4. **Run it on a schedule.** Submit the grid to Batch daily or hourly and store each price with the time it was seen.

```python Python
# pip install requests
import json
import requests

params = {
    "apikey": "YOUR_ZENROWS_API_KEY",
    "url": SEARCH_URL,  # a car hire or tour search URL with dates in the query
    "mode": "auto",
    "proxy_country": "gb",
    "css_extractor": json.dumps({
        "supplier": ".result-card .supplier-name",
        "vehicle": ".result-card .vehicle-class",
        "price": ".result-card .total-price",
    }),
}
response = requests.get("https://api.zenrows.com/v1/", params=params)
print(response.json())
```

```bash cURL
# Collect every activity page on a tour operator's site as Markdown
curl -X POST "https://api.zenrows.com/v1/crawls" \
  -H "X-API-Key: YOUR_ZENROWS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "url": "TOUR_OPERATOR_URL",
    "max_items": 1000,
    "include_patterns": ["/activity/"],
    "exclude_patterns": ["/blog/", "/careers/"],
    "output_format": "markdown"
  }'
# Then read the pages with GET https://api.zenrows.com/v1/crawls/{crawl_id}
```

```bash CLI
npx -y @zenrows/cli init
zenrows fetch TOUR_SEARCH_URL --proxy-country gb --output markdown
# jobs.jsonl holds one {"url": "..."} per search, one line per route and date
zenrows batch create jobs.jsonl --wait
zenrows batch results JOB_ID --out results.jsonl
```

```text Claude Code (MCP)
# Connect once
claude mcp add zenrows -e ZENROWS_API_KEY=YOUR_ZENROWS_API_KEY -- npx -y @zenrows/mcp

# Then ask:
Use Zenrows to search GetYourGuide for food tours in Lisbon on 14 November for two adults, from a UK visitor's point of view, and return each tour's title, price per person in GBP, duration, start times and rating as JSON.
```

## Which Zenrows product fits

| If you need to | Use | Why |
|---|---|---|
| Price one search or one product page | [Fetch](/products/fetch) | Renders the page from the market you choose and returns HTML, Markdown or named fields |
| Get rates and inclusions without writing selectors | [Extract](/products/extract) | Automatic structured extraction returns JSON that adapts when an OTA changes its layout |
| Map a tour operator or hotel chain catalog | [Crawl](/products/crawl) | Follows links on one domain and keeps only the detail URLs you ask for |
| Run a full route and date grid every day | [Batch](/products/batch) | One job for the whole grid, results by webhook or download |
| Search an airline that needs several clicks or a login | [Browser](/products/browser) | A real browser you drive with Playwright or Puppeteer |

## What success looks like

| Measure | What good looks like | How to check it |
|---|---|---|
| Price accuracy | The price you stored matches what a traveller sees for the same search and market | Re-run a sample of searches by hand each week and compare |
| Grid coverage | Every route, date and market cell returns a price or an explicit "sold out" | Count empty cells per provider after each run |
| Freshness | Prices for near-term dates are refreshed more often than far-out dates | Track the age of each price against its travel date |
| Point-of-sale correctness | Each record carries the currency and country it was priced in | Flag records where currency does not match the market |
| Run time | A full grid finishes well before the prices it captures go stale | Log start and finish time per Batch job against grid size |

## Travel data scraping FAQ

### What is travel data scraping?

Travel data scraping is the automated collection of prices, availability, schedules and reviews from travel websites. A scraper runs the same searches a traveller would, on airline sites, OTAs, hotel chains, car hire brokers and tour marketplaces, and stores the results so you can compare providers, track prices over time or feed a pricing model.

### What travel data can I collect?

Anything shown to a visitor after a search: fares and fare classes, flight schedules, nightly hotel rates by room type, taxes and fees, rooms or seats left, car hire quotes by vehicle class, tour prices and time slots, cancellation terms, review scores and review text. Each of these depends on the dates and market you search with, so store those alongside the price.

### Is it legal to scrape travel websites?

Collecting publicly displayed prices and availability is common practice in travel pricing and research. Check each site's terms of use, stay away from pages that need a login unless you have the right to access them, and treat reviews and photos as content you should not republish. For your specific use, ask your legal team.

### Should I use a travel data API or scrape the sites?

Partner APIs from airlines, GDSs and OTAs give you their inventory on their terms, often with contracts and coverage limits. A travel scraping API such as Zenrows returns what each site shows the public, including providers that have no API and the exact price a visitor sees in a given market. A common setup uses the API for booking and scraping to check that the API price matches the public one.

### Why does a travel site show a different price from another country?

Airlines, OTAs and hotel chains price by point of sale: the visitor's country, currency and sometimes device. To compare like for like, send each search from the market you care about with geotargeting, and record the country and currency with every price.

### How do I scrape prices that only appear after a search form?

First check the URL after a manual search. Many OTAs, car hire brokers and tour sites put origin, destination and dates in the query string, so each cell of your grid becomes a plain URL you can fetch. When the price only appears after typing and clicking, have Fetch run page actions (fill, click, wait for an element to load) before it returns the page, or drive the search with Browser for longer flows such as airline seat maps.

### How often should travel prices be refreshed?

Match the refresh rate to how close the travel date is. Searches for the next two weeks change several times a day; dates six months out move slowly. A common pattern is hourly or daily Batch runs for near-term dates and weekly runs for the rest of the grid.

## Related use cases

- [Hotel data scraping](https://www.zenrows.com/use-cases/hotel-data-scraping.md): Nightly rates, room types and parity gaps from Booking.com, Expedia, Google Hotels and brand sites.
- [Flight price scraping](https://www.zenrows.com/use-cases/scraping-flight-prices.md): Fares, fare classes and award seats by route and date from airline sites and OTAs.
- [Short-term rental data](https://www.zenrows.com/use-cases/short-term-rental-data.md): Nightly rates, fees, calendars and reviews from Airbnb, Vrbo and Booking.com listings, per market.
- [Review scraping](https://www.zenrows.com/use-cases/review-scraping.md): Review text, ratings, dates and replies from Amazon, Google, Yelp, Trustpilot and G2, every page.
- [Dynamic pricing data](https://www.zenrows.com/use-cases/dynamic-pricing.md): Live competitor price, stock and demand inputs for a repricing engine, on demand or on a schedule.
- [Restaurant data](https://www.zenrows.com/use-cases/restaurant-data.md): Locations, hours, menus, item prices and ratings from chain sites, Google Maps, Yelp and delivery apps.

Start free: https://app.zenrows.com/register. Docs: https://docs.zenrows.com
