Tripadvisor Scraper avatar

Tripadvisor Scraper

Pricing

from $3.50 / 1,000 item scrapeds

Go to Apify Store
Tripadvisor Scraper

Tripadvisor Scraper

πŸ”₯ Up to 30% OFF! Scrape TripAdvisor β€” no login. Hotels, restaurants & attractions: rating, reviews count, ranking, price level, address, coordinates, photos, sub-ratings + reviews. Fast & reliable, pay per item.

Pricing

from $3.50 / 1,000 item scrapeds

Rating

0.0

(0)

Developer

Bruno

Bruno

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

13 days ago

Last modified

Share

πŸ”₯ TripAdvisor Scraper (Real Browser)

Gets real hotels, restaurants and attractions (plus their reviews) from TripAdvisor by driving an actual headless browser (Playwright/Chromium) through an Apify residential proxy β€” the same way a person would browse the site. A plain HTTP request to TripAdvisor gets a 403/challenge page; this Actor renders the real page, waits for content to actually appear, and reads it off the live DOM plus TripAdvisor's own public structured data (schema.org JSON-LD + Open Graph tags).

Public data only, no login. Honesty first: if TripAdvisor shows a CAPTCHA/"access denied" challenge, or simply doesn't render the expected cards/detail page in time, this Actor reports exactly what it saw (with a raw page-text snippet) instead of guessing or inventing data. It never fabricates a rating, a review or a place that isn't really on the page.

What you get per place

  • Identity & location: name, category, type(s), TripAdvisor locationId & geoId, canonical URL.
  • Scores: overall rating, review count, aggregate rating (from JSON-LD), ranking parsed into position / total / category (e.g. #12 of 419 Hotels in Rome), and a rating distribution (Excellent / Very good / Average / Poor / Terrible counts) when shown.
  • Contact: phone, alternate phone, website, full street address plus a structured addressDetails (street / city / region / postalCode / country) and GPS latitude/longitude.
  • Commercial: price range, price level, hotel class (stars), cuisines (restaurants), amenities, opening hours.
  • Media: main image + a gallery of canonical photo URLs (and card thumbnails on listings).
  • Reviews: title, rating, sub-ratings, text, date, date of stay, trip type, author + profile URL, review permalink, contribution & helpful-vote counts.

Input

{
"searchQuery": "hotels in Rome",
"category": "hotels",
"urls": [],
"maxItems": 30,
"maxReviews": 0,
"maxReviewPages": 0,
"proxyConfiguration": { "useApifyProxy": true, "apifyProxyGroups": ["RESIDENTIAL"] },
"timeoutSecs": 60
}
  • searchQuery β€” free-text TripAdvisor search, e.g. "hotels in Rome", "restaurants in Lisbon", "things to do in Paris". Optional, but you must supply this and/or urls.
  • category β€” hotels / restaurants / attractions. Controls which TripAdvisor URL pattern is searched/scraped for searchQuery (and for any urls that are listing pages). Default hotels.
  • urls β€” TripAdvisor URLs to scrape directly instead of / in addition to searching:
    • Detail pages (a Hotel_Review-, Restaurant_Review- or Attraction_Review- URL) are always opened for full details (+ reviews if maxReviews > 0), regardless of category.
    • Listing pages (a Hotels-g..., Restaurants-g... or Attractions-g... URL) are scraped like a search result page β€” their cards are extracted the same way.
  • maxItems β€” max places returned, default 30, max 300.
  • maxReviews β€” reviews per place (title, rating, sub-ratings, text, date, date of stay, trip type, author, permalink). Default 0, max 500. When 0, places found via searchQuery/listing pages are returned with just their card data (name, rating, review count, price, location, thumbnail, detail URL) β€” the individual detail page isn't opened, to keep the run fast and cheap. Explicit detail URLs in urls are always opened regardless, just without reviews if maxReviews is 0. When maxReviews is larger than one page, the Actor automatically walks TripAdvisor's review pagination (-or10-, -or20-, …) to collect that many.
  • maxReviewPages β€” optional hard cap on extra review pages opened per place. 0 = automatic.
  • proxyConfiguration β€” defaults to Apify RESIDENTIAL proxy, strongly recommended: TripAdvisor blocks datacenter IPs hard.
  • timeoutSecs β€” how long to wait for a page to render before giving up, default 60.

Output

One item per place. From a search/listing page with maxReviews: 0:

{
"category": "hotels",
"name": "Hotel Artemide",
"rating": 4.5,
"reviewCount": 3120,
"priceRange": "$180 - $260",
"priceLevel": null,
"location": "Rome, Italy",
"detailUrl": "https://www.tripadvisor.com/Hotel_Review-g187791-d229722-Reviews-...html",
"listPosition": 1,
"locationId": "229722",
"geoId": "187791",
"thumbnail": "https://dynamic-media-cdn.tripadvisor.com/.../photo.jpg",
"rawText": "Hotel Artemide 4.5 ... 3,120 reviews $180 - $260 ...",
"scrapedAt": "2026-10-05T12:00:00.000Z"
}

From a detail page (explicit urls, or maxReviews > 0):

{
"category": "hotels",
"name": "Hotel Artemide",
"rating": 4.5,
"reviewCount": 3120,
"ranking": "#12 of 419 Hotels in Rome",
"rankingPosition": 12,
"rankingTotal": 419,
"rankingCategory": "Hotels in Rome",
"priceRange": "$180 - $260",
"priceRangeDetail": "$$$",
"priceLevel": null,
"hotelClass": 4,
"location": "Rome, Italy",
"address": "Via Nazionale, 22, 00184 Rome Italy",
"addressDetails": { "street": "Via Nazionale, 22", "city": "Rome", "region": "Lazio", "postalCode": "00184", "country": "Italy" },
"latitude": 41.9015,
"longitude": 12.4953,
"phone": "+39 06 489911",
"website": "https://www.hotelartemide.it/",
"cuisines": null,
"amenities": ["Free Wifi", "Pool", "Restaurant", "..."],
"openingHours": null,
"aggregateRating": 4.5,
"aggregateReviewCount": 3120,
"ratingDistribution": { "excellent": 2500, "veryGood": 450, "average": 120, "poor": 30, "terrible": 20 },
"mainImage": "https://.../photo.jpg",
"images": ["https://.../1.jpg", "https://.../2.jpg"],
"types": ["Hotel"],
"description": "Set in the heart of Rome...",
"locationId": "229722",
"geoId": "187791",
"canonicalUrl": "https://www.tripadvisor.com/Hotel_Review-...html",
"detailUrl": "https://www.tripadvisor.com/Hotel_Review-...html",
"reviewsCount": 25,
"reviews": [
{
"title": "Wonderful stay",
"rating": 5,
"author": "janedoe123",
"date": "August 2026",
"dateOfStay": "August 2026",
"tripType": "Couples",
"subRatings": [5, 5, 4, 5],
"contributions": 42,
"helpfulVotes": 3,
"profileUrl": "https://www.tripadvisor.com/Profile/janedoe123",
"reviewUrl": "https://www.tripadvisor.com/ShowUserReviews-...html",
"text": "..."
}
],
"scrapedAt": "2026-10-05T12:00:00.000Z",
"bodyTextSnippet": "...first 1500 chars of the rendered page text, as a verification backstop..."
}

rawText / bodyTextSnippet are kept so you can verify or re-parse anything the regex-based field extraction missed β€” nothing is hidden. Some heuristic fields (location on cards, title/author on reviews, ratingDistribution) can come back null if TripAdvisor's current markup doesn't expose them β€” the structured JSON-LD fields and the raw text are always there as fallbacks.

If a page couldn't be read, you get a single honest item instead, e.g.:

{ "error": "BLOCKED: TripAdvisor served an anti-bot/challenge page instead of content at ...", "url": "..." }

Other possible error values: NO_ITEMS_MATCHED / NO_ITEMS_PARSED (TripAdvisor changed its markup or showed an unrelated page), TIMEOUT (nothing rendered in time), NAVIGATION_FAILED (after retries), or a plain input-validation message.

How it works

  1. Launches real Chromium (Playwright) through Apify's RESIDENTIAL proxy with realistic headers and viewport, rotating browser/proxy sessions so one soured IP can't poison a whole run.
  2. For searchQuery, opens https://www.tripadvisor.com/Search?q=...; for urls, opens each URL directly, classified as a detail page or a listing page by TripAdvisor's own stable URL patterns.
  3. Dismisses TripAdvisor's cookie-consent (OneTrust) banner and common interstitials.
  4. Detects an anti-bot/CAPTCHA challenge page by its text and retries with a fresh proxy session (up to 4 attempts) before giving up and reporting BLOCKED.
  5. On a search/listing page: scrolls to trigger lazy loading, waits for real category result links to render, then extracts each card (name, rating, review count, price, location, thumbnail, position) anchored on those links β€” de-duplicated by TripAdvisor's own numeric place id. If no cards render, it follows the category's "see all" listing-page link once before giving up honestly.
  6. On a detail page: waits for the <h1>, then mines both the rendered DOM and TripAdvisor's schema.org JSON-LD + Open Graph tags for name, rating, review count, ranking, structured address, GPS coordinates, phone, website, price, cuisines, hotel class, amenities, hours and photos β€” and, if maxReviews > 0, walks review pagination to collect enriched reviews.

Notes

  • TripAdvisor's markup is obfuscated/React-rendered and changes over time; extraction combines stable URL-pattern anchors, schema.org JSON-LD and regex/heuristics over rendered text and aria-labels. rawText/bodyTextSnippet are always included as a source-of-truth backstop.
  • Residential proxy IPs and TripAdvisor's own bot defenses mean an occasional run may still hit a challenge page after retries β€” when that happens the Actor says so plainly rather than pretending to have data.
  • Setting maxReviews: 0 for a search/listing run is the cheap/fast mode (one page load covers up to maxItems places). Setting maxReviews > 0 opens one extra page load per place (plus review pagination pages for deep review pulls).

⭐ Enjoying this Actor?

A quick rating/review helps others find it. Found a query pattern TripAdvisor didn't render right? Open a ticket on the Issues tab.