---
title: "Tripadvisor scraper"
description: "Scrape Tripadvisor hotels, restaurants and attractions as JSON: ratings, review counts, sub-scores and reviews. One API request from Python, Node.js, the CLI or MCP."
canonical: https://www.zenrows.com/scrape/tripadvisor
updated: 2026-10-20
---

# Tripadvisor scraper

The Zenrows Tripadvisor scraper turns a Tripadvisor hotel or destination URL into structured JSON: name, star rating, price range, overall rating, review count, sub-scores, rating distribution, amenities, nearest airport and traveler reviews with trip type and owner responses. You send the URL, Fetch in Adaptive Stealth Mode opens the page, and Extract returns the fields. Run it from an API call, the CLI or an AI agent.

- Site: tripadvisor.com
- Returns: Hotels, restaurants, ratings, sub-scores and traveler reviews

## Run it: one Tripadvisor hotel in, JSON out

```json Input
{
  "url": "https://www.tripadvisor.com/Hotel_Review-g60763-d93589-Reviews-The_Michelangelo_New_York-New_York_City_New_York.html",
  "mode": "auto",
  "extract": "auto"
}
```

```json Output
{
  "hotel": {
    "name": "The Michelangelo New York",
    "star_rating": 4,
    "price_range": "$312 - $1,083 (Based on Average Rates for a Standard Room)",
    "hotel_styles": ["4 of 5 stars", "Business", "Historic Hotel"],
    "official_website_url": "https://www.michelangelohotel.com/",
    "tripadvisor_url": "https://www.tripadvisor.com/Hotel_Review-g60763-d93589-Reviews-The_Michelangelo_New_York-New_York_City_New_York.html"
  },
  "ratings": {
    "overall_rating": 4.5,
    "review_count": 5218,
    "excellent_count": 3607,
    "good_count": 1127,
    "average_count": 294,
    "poor_count": 109,
    "terrible_count": 81,
    "location_score": 4.9,
    "rooms_score": 4.6,
    "service_score": 4.6,
    "value_score": 4.3
  },
  "reviews": [
    {
      "review_title": "Hidden Gem",
      "review_text": "A lovely hotel in a great location. Despite the busy area, the rooms are very quiet because it's an older building…",
      "date_of_stay": "October 2026",
      "trip_type": "friends",
      "reviewer_location": "Paso Robles, California",
      "management_response_text": "It is a pleasure to know your room offered a quiet retreat despite the lively neighborhood…"
    }
  ]
}
```

Request and output of a live call to a Tripadvisor hotel page on Oct 20, 2026, trimmed for length. A field is returned when the page shows it.

## What data can you scrape from Tripadvisor?

A Tripadvisor hotel page comes back as the hotel, its ratings, its reviews, its amenities and its location. A destination page returns lists of hotels, restaurants and attractions. These are the fields teams use most, with the path where each lives in the JSON.

| Field | What it holds | Example |
|---|---|---|
| `hotel.name` | Property name | `The Michelangelo New York` |
| `hotel.star_rating` | Hotel class | `4` |
| `hotel.price_range` | Tripadvisor's average rate range for a standard room | `$312 - $1,083 (Based on Average Rates…)` |
| `hotel.hotel_styles[]` | Class, style and languages tags | `["Business", "Historic Hotel"]` |
| `hotel.official_website_url` | The hotel's own website | `https://www.michelangelohotel.com/` |
| `ratings.overall_rating` | Traveler rating out of 5 | `4.5` |
| `ratings.review_count` | Number of reviews | `5218` |
| `ratings.excellent_count` | Reviews at each level, from excellent to terrible | `3607` |
| `ratings.location_score` | Sub-score out of 5, with rooms, service, value, cleanliness and sleep quality | `4.9` |
| `reviews[].review_title`, `reviews[].review_text` | Title and text of each review on the page | `Hidden Gem` |
| `reviews[].date_of_stay` | Month and year of the stay | `October 2026` |
| `reviews[].trip_type` | Family, couple, friends, business or solo | `friends` |
| `reviews[].management_response_text` | The hotel's reply, when there is one | `It is a pleasure to know…` |
| `amenities[]` | Property amenities | `Free High Speed Internet (WiFi)` |
| `location.nearest_airport_name` | Nearest airport, with distance in `nearest_airport_distance_miles` | `LaGuardia Airport` |
| `restaurants[]` (destination) | Name, cuisines, price level, rating, review count, link | `{ "name": "Le progres", … }` |
| `attractions[]` (destination) | Name, category, rating, review count, link | `{ "category": "Bodies of Water", … }` |

## How to scrape Tripadvisor with Zenrows

1. **Create a free Zenrows account** and copy your API key from the dashboard.
2. **Pick the Tripadvisor URL.** Hotel pages follow `/Hotel_Review-g<geo>-d<id>-Reviews-<name>.html`, restaurants `/Restaurant_Review-…`, attractions `/Attraction_Review-…`, and destinations `/Tourism-g<geo>-<name>-Vacations.html`.
3. **Send it with the default configuration**: Adaptive Stealth Mode to open the page and Extract to return the fields.
4. **Read `parsed`** from the response. To keep only some fields, list them with their paths and the response returns just those.
5. **Page through reviews and run your list in Batch** once one URL returns what you need.

```python Python
# pip install requests
import requests

params = {
    "apikey": "YOUR_ZENROWS_API_KEY",
    "url": "https://www.tripadvisor.com/Hotel_Review-g60763-d93589-Reviews-The_Michelangelo_New_York-New_York_City_New_York.html",
    "mode": "auto",          # Adaptive Stealth Mode
    "extract": "auto",       # structured JSON
}
response = requests.get("https://api.zenrows.com/v1/", params=params, timeout=180)
response.raise_for_status()

data = response.json()["parsed"]
print(data["hotel"]["name"], data["ratings"]["overall_rating"], data["ratings"]["review_count"])
for review in data["reviews"]:
    print(review["date_of_stay"], review["trip_type"], "|", review["review_title"])
```

```javascript Node.js
// Node 18+ (built-in fetch)
const params = new URLSearchParams({
  apikey: "YOUR_ZENROWS_API_KEY",
  url: "https://www.tripadvisor.com/Hotel_Review-g60763-d93589-Reviews-The_Michelangelo_New_York-New_York_City_New_York.html",
  mode: "auto",
  extract: "auto",
});

const response = await fetch(`https://api.zenrows.com/v1/?${params}`, {
  signal: AbortSignal.timeout(180_000),
});
if (!response.ok) throw new Error(`${response.status}: ${await response.text()}`);

const { parsed } = await response.json();
const r = parsed.ratings;
console.log(parsed.hotel.name, r.overall_rating, r.review_count);
const answered = parsed.reviews.filter((x) => x.management_response_text).length;
console.log(`${answered} of ${parsed.reviews.length} reviews on this page have an owner response`);
```

```bash cURL
curl "https://api.zenrows.com/v1/?apikey=YOUR_ZENROWS_API_KEY&url=https%3A%2F%2Fwww.tripadvisor.com%2FHotel_Review-g60763-d93589-Reviews-The_Michelangelo_New_York-New_York_City_New_York.html&mode=auto&extract=auto"

# Only the fields you need
curl "https://api.zenrows.com/v1/?apikey=YOUR_ZENROWS_API_KEY&url=https%3A%2F%2Fwww.tripadvisor.com%2FHotel_Review-g60763-d93589-Reviews-The_Michelangelo_New_York-New_York_City_New_York.html&mode=auto&extract=auto&extract_fields=hotel.name%2Cratings.overall_rating%2Cratings.review_count%2Creviews.review_title"
```

```python Python SDK
# pip install zenrows
from zenrows import ZenRowsClient

client = ZenRowsClient("YOUR_ZENROWS_API_KEY")
base = "https://www.tripadvisor.com/Hotel_Review-g60763-d93589-Reviews{}-The_Michelangelo_New_York-New_York_City_New_York.html"
reviews = []
for offset in (0, 10, 20):
    page = "" if offset == 0 else f"-or{offset}"     # Tripadvisor's review paging
    response = client.get(base.format(page), params={"mode": "auto", "extract": "auto"})
    reviews += response.json()["parsed"]["reviews"]
print(len(reviews), "reviews collected")
```

## Input

The scraper takes one Tripadvisor URL per request, plus the options below. A Batch job applies the same parameters to every task, so the input for a city's hotels is a list of URLs with these settings.

| Parameter | Type | Default | Description |
|---|---|---|---|
| `url` | string | required | A Tripadvisor hotel, restaurant, attraction or destination page, on tripadvisor.com or a country site |
| `mode` | string | `auto` | Adaptive Stealth Mode: starts with the lightest setup and adds rendering and protected-site handling only when Tripadvisor needs them |
| `extract` | string | `auto` | Returns the page's fields as JSON in `parsed`, next to the raw `html` |
| `extract_fields` | string | all fields | Comma-separated paths to keep, such as `ratings.overall_rating,reviews.review_text` |
| `proxy_country` | string | any | Two-letter country code. Tripadvisor shows prices in the visitor's currency, so set it for price ranges you compare |
| `wait_for` | string | none | A CSS selector to wait for before the page is read |
| `session_id` | integer | none | Keep the same session for up to 10 minutes while you page through one property's reviews |

```json Batch input
{
  "type": "regular",
  "status": "closed",
  "zenrows_params": {
    "mode": "auto",
    "extract": "auto"
  },
  "tasks": [
    { "url": "https://www.tripadvisor.com/Hotel_Review-g60763-d93589-Reviews-The_Michelangelo_New_York-New_York_City_New_York.html", "external_id": "d93589" },
    { "url": "https://www.tripadvisor.com/Hotel_Review-g60763-d93589-Reviews-or10-The_Michelangelo_New_York-New_York_City_New_York.html", "external_id": "d93589-or10" },
    { "url": "https://www.tripadvisor.com/Restaurant_Review-g60763-d425787-Reviews-Katz_s_Deli-New_York_City_New_York.html", "external_id": "d425787" }
  ]
}
```

## Output

Every response is JSON with two keys: `html`, the page as Tripadvisor served it, and `parsed`, the structured record. The shape of `parsed` follows the page type. A hotel page returns the hotel, ratings, reviews, amenities and location; a destination page returns lists of hotels, restaurants and attractions. Both samples are trimmed outputs of live requests.

```json Hotel page
{
  "hotel": {
    "name": "The Michelangelo New York",
    "description": "The Michelangelo New York - Starhotels Collezione combines elegance and practicality, design features and classic luxury details; a stylish reflection of the city's eclectic multicultural spirit…",
    "star_rating": 4,
    "price_range": "$312 - $1,083 (Based on Average Rates for a Standard Room)",
    "hotel_styles": ["4 of 5 stars", "Business", "Historic Hotel", "English, French, Spanish, German and 1 more"],
    "primary_photo_url": "https://media-cdn.tripadvisor.com/media/photo-s/16/4e/3c/30/hotel-facade.jpg",
    "official_website_url": "https://www.michelangelohotel.com/"
  },
  "ratings": {
    "overall_rating": 4.5,
    "review_count": 5218,
    "excellent_count": 3607,
    "good_count": 1127,
    "average_count": 294,
    "poor_count": 109,
    "terrible_count": 81,
    "cleanliness_score": 4.7,
    "location_score": 4.9,
    "rooms_score": 4.6,
    "service_score": 4.6,
    "sleep_quality_score": 4.7,
    "value_score": 4.3
  },
  "amenities": ["Paid private parking on-site", "Free High Speed Internet (WiFi)", "Fitness Center with Gym / Workout Room", "Bar / lounge"],
  "location": {
    "region": "New York",
    "latitude": 40.761528,
    "longitude": -73.98261,
    "nearest_airport_name": "LaGuardia Airport",
    "nearest_airport_distance_miles": 5.8
  },
  "reviews": [
    {
      "review_title": "Take the good with the bad?",
      "review_text": "This is an older hotel that's starting to show the wear and tear. It has a gilded interior with most staff still wearing formal uniforms like it is 1956…",
      "date_of_stay": "October 2026",
      "trip_type": "couple",
      "reviewer_location": "1 contribution",
      "management_response_text": "We are glad our location suited your plans and that our team members were kind and helpful…"
    }
  ]
}
```

```json Destination page
{
  "destination": {
    "name": "Blauzac",
    "country": "France",
    "page_url": "https://www.tripadvisor.com/Tourism-g425040-Blauzac_Gard_Occitanie-Vacations.html",
    "total_review_count": 108
  },
  "hotels": [
    {
      "name": "La Fontaine des Oliviers",
      "price_from": "from $192/night",
      "rating": 5,
      "review_count": 6,
      "street_address": "Route d'Uzes, 30700 Blauzac France",
      "url": "/Hotel_Review-g425040-d19800681-Reviews-La_Fontaine_des_Oliviers-Blauzac_Gard_Occitanie.html"
    }
  ],
  "restaurants": [
    {
      "name": "Le progres",
      "cuisines": "French, European",
      "price_level": "$$ - $$$",
      "rating": 4.1,
      "review_count": 69,
      "url": "/Restaurant_Review-g425040-d4357791-Reviews-Le_progres-Blauzac_Gard_Occitanie.html"
    }
  ],
  "attractions": [
    {
      "name": "Gorges du Gardon",
      "category": "Bodies of Water",
      "rating": 4.6,
      "review_count": 61,
      "url": "/Attraction_Review-g425041-d10784806-Reviews-Gorges_du_Gardon-Collias_Gard_Occitanie.html"
    }
  ],
  "breadcrumbs": [
    { "name": "France", "position": 2, "url": "/Tourism-g187070-France-Vacations.html" },
    { "name": "Gard", "position": 4, "url": "/Tourism-g2431943-Gard_Occitanie-Vacations.html" }
  ]
}
```

Need a spreadsheet? Load `parsed["reviews"]` into pandas with `pd.json_normalize(...)` and write CSV or Excel. Need the page for an LLM? Ask for Markdown instead of JSON.

## Scrape Tripadvisor from your coding agent

Claude Code, Cursor, Codex and any MCP client can scrape Tripadvisor from a prompt.

The agent sends the same Fetch and Extract request a developer would, so it reads the ratings and reviews above and can summarize them for you. Connect the Zenrows MCP server once, or install the CLI and let the agent run it in the terminal.

```bash Connect the MCP server (Claude Code)
claude mcp add zenrows -e ZENROWS_API_KEY=YOUR_ZENROWS_API_KEY -- npx -y @zenrows/mcp
```

```json MCP config (Cursor, Claude Desktop, Windsurf)
{
  "mcpServers": {
    "zenrows": {
      "command": "npx",
      "args": ["-y", "@zenrows/mcp"],
      "env": { "ZENROWS_API_KEY": "YOUR_ZENROWS_API_KEY" }
    }
  }
}
```

```bash Or run the CLI
npx -y @zenrows/cli init
zenrows extract "https://www.tripadvisor.com/Hotel_Review-g60763-d93589-Reviews-The_Michelangelo_New_York-New_York_City_New_York.html"
```

```text Then ask your agent
Use Zenrows to scrape the first three pages of reviews for this hotel:
https://www.tripadvisor.com/Hotel_Review-g60763-d93589-Reviews-The_Michelangelo_New_York-New_York_City_New_York.html
Group the complaints by theme, count how many reviews mention each one,
and tell me which share of reviews got a reply from the hotel.
```

## Scrape Tripadvisor at scale with Batch and Crawl

**Batch** runs a list of Tripadvisor URLs as one job, in parallel, with your own ID on each result. Put each property's review pages in one job, using the `d` number as the ID, and rerun it weekly to collect new reviews and track rating changes.

**Crawl** follows links from a Tripadvisor page and returns every page it reaches. Start it on a destination page, keep the links that contain `/Hotel_Review-` or `/Restaurant_Review-`, and it collects the property pages of that place. Send that list to Batch with Extract.

```bash Batch (cURL)
curl -X POST "https://async.api.zenrows.com/v1/jobs" \
  -H "X-API-Key: YOUR_ZENROWS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "type": "regular",
    "status": "closed",
    "zenrows_params": { "mode": "auto", "extract": "auto" },
    "tasks": [
      { "url": "https://www.tripadvisor.com/Hotel_Review-g60763-d93589-Reviews-The_Michelangelo_New_York-New_York_City_New_York.html", "external_id": "d93589" },
      { "url": "https://www.tripadvisor.com/Restaurant_Review-g60763-d425787-Reviews-Katz_s_Deli-New_York_City_New_York.html", "external_id": "d425787" }
    ]
  }'

# Read the results when the job finishes
curl "https://async.api.zenrows.com/v1/jobs/JOB_ID/results?status=successful" \
  -H "X-API-Key: YOUR_ZENROWS_API_KEY"
```

```bash Batch (CLI)
# places.jsonl: one {"url": "...", "external_id": "...", "extract": "auto"} per line
zenrows batch create places.jsonl --wait
zenrows batch results <job-id> --out tripadvisor.jsonl
```

```bash Crawl (cURL)
curl -X POST "https://api.zenrows.com/v1/crawls" \
  -H "X-API-Key: YOUR_ZENROWS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "url": "https://www.tripadvisor.com/Tourism-g425040-Blauzac_Gard_Occitanie-Vacations.html",
    "depth": 1,
    "max_pages": 100,
    "include_patterns": ["/Hotel_Review-", "/Restaurant_Review-"]
  }'
```

**Scheduled jobs** run the same Batch job on a timetable, on Zenrows' side: every few hours, once a day, at set times on chosen days, or once at a future date. Each run keeps its own results, a webhook can tell your app when a run finishes, and you can pause or resume the schedule at any time, with no cron server to keep alive.

```bash Scheduled job (cURL)
# Runs every day on Zenrows' side; each run keeps its own results
curl -X POST "https://async.api.zenrows.com/v1/jobs" \
  -H "X-API-Key: YOUR_ZENROWS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
      "type": "scheduled",
      "status": "closed",
      "schedule": {
        "rate": {
          "every": 1,
          "unit": "day"
        }
      },
      "zenrows_params": {
        "mode": "auto",
        "extract": "auto"
      },
      "tasks": [
        {
          "url": "https://www.tripadvisor.com/Hotel_Review-g60763-d93589-Reviews-The_Michelangelo_New_York-New_York_City_New_York.html",
          "external_id": "tripadvisor"
        }
      ]
    }'

# Or at set times: "schedule": { "calendar": { "times_of_day": ["09:00"],
#   "cadence": { "weekly": { "days": ["mon", "thu"] } } }, "timezone": "Europe/Madrid" }
```

## What teams do with Tripadvisor data

| Use case | Data they pull | Who runs it |
|---|---|---|
| Review and sentiment analysis | Review titles and text, trip type, date of stay, rating distribution | Hotel groups, CX and market research teams |
| Competitive benchmarking | Overall rating, sub-scores, review count and price range for a competitive set | Hotel revenue and brand teams |
| Reputation management | New reviews and the share with an owner response, week by week | Hospitality and restaurant marketing teams |
| Destination research | Hotels, restaurants and attractions per place, with ratings and price levels | Tourism boards, travel media and planners |
| Restaurant lead lists | Restaurants by town with cuisine, price level and rating | Food service suppliers and delivery platforms |
| AI travel assistants | Ratings, amenities and review summaries, or the page as Markdown | AI and product teams |

## Tips for scraping Tripadvisor

- **Page reviews with `-or10`.** Tripadvisor puts the review offset in the path: insert `-or10`, `-or20` and so on after `-Reviews` to read the next pages of reviews.
- **Key every place on its `d` number.** The `d93589` part of the URL is Tripadvisor's location ID, and the name part of the URL can change. Use the `d` number as your ID and the `g` number for the city.
- **Keep the canonical URL.** A URL with an old or wrong name segment still opens the place its `d` number points to. Store `hotel.tripadvisor_url` from the response as the clean link.
- **Read the distribution, not only the average.** `excellent_count` through `terrible_count` show how the rating is built, so you can see a rise in poor reviews that a 4.5 average hides.
- **Pick the country site for local reviews.** tripadvisor.co.uk, tripadvisor.de and tripadvisor.fr show the same places with the local language first. Keep one site per dataset.
- **Start from a destination page.** `/Tourism-g<geo>-…` lists the top hotels, restaurants and attractions of a place with their links, which is the fastest way to build a URL list.

## Frequently asked questions

### Is it legal to scrape Tripadvisor?

Collecting publicly available data from Tripadvisor, such as ratings, review counts, amenities and price ranges shown to every visitor, is common practice for market research. Reviews carry reviewer names and locations, which are personal data protected by laws such as the GDPR and the CCPA, so collect only what you have a legitimate reason to use. Check Tripadvisor's terms for your use case and ask your lawyer if you are unsure.

### Is there an official Tripadvisor API?

Yes. The Tripadvisor Content API gives approved partners location details, ratings and up to five reviews and five photos per location, with attribution rules on how the content is shown. It does not return a place's full review history, the rating distribution of every page or bulk lists, which is why teams use a scraper for research data.

### What Tripadvisor pages can I scrape?

Hotel, restaurant and attraction pages ( /Hotel_Review- , /Restaurant_Review- , /Attraction_Review- ) and destination pages ( /Tourism- ), on tripadvisor.com and the Tripadvisor country sites.

### How do I scrape Tripadvisor reviews?

Request the property page with Adaptive Stealth Mode and Extract, and read reviews[] : title, text, date of stay, trip type, reviewer location and the owner's response. For older reviews, add -or10 , -or20 and so on to the URL and send the pages as one Batch job.

### How do I scrape Tripadvisor with Python?

Send a GET request to https://api.zenrows.com/v1/ with your API key, the Tripadvisor URL, Adaptive Stealth Mode and Extract turned on, as in the Python example above. The response's parsed key holds the record as a Python dictionary. The zenrows package on PyPI wraps the same request.

### Can I scrape Tripadvisor restaurants and attractions?

Yes. Restaurant and attraction pages work the same way as hotels, and a destination page returns lists of hotels, restaurants and attractions with rating, review count, price level, cuisine or category and the link to each. For local businesses on another review site, see the Yelp scraper .

### Can AI agents scrape Tripadvisor with Zenrows?

Yes. Connect the Zenrows MCP server to Claude, Cursor, Codex or any MCP client, or give your agent the Zenrows CLI. Ask for the places and reviews you want in plain language and the agent calls Fetch and Extract for you.

### Can I scrape Tripadvisor on a schedule?

Yes. Create a scheduled Batch job with your Tripadvisor URLs and the same settings as a single request, and Zenrows runs it on its side: every few hours, once a day, at set times on chosen days, or once at a future date. Each run keeps its own results, a webhook can notify your app when a run finishes, and the schedule can be paused or resumed at any time.

### Which integrations work with the Tripadvisor scraper?

Zenrows works with n8n, Make, Zapier, Clay, Dify, LangChain, LlamaIndex, CrewAI and Mastra, plus the Python, Node.js and Go SDKs and any HTTP client. Send new reviews to Slack, a sheet or a sentiment model from the workflow tool you already use. See the integrations page for the full list. For hotel scores on another site, see the Booking.com scraper .

### What format does the data come in?

JSON by default, with the structured record in parsed and the original page in html . You can also ask for the page as Markdown or plain text, which is what most LLM and RAG pipelines want.

All scrapers: https://www.zenrows.com/scrape. Start free: https://app.zenrows.com/register. Docs: https://docs.zenrows.com
