Tony Wang5 min de lecturaCómo hacer scraping de TripAdvisor en 2026 (API y Python)
Haz scraping de TripAdvisor en 2026 — Python DIY, no-code o una API estructurada para hoteles, restaurantes, atracciones y reviews, con lo legal.
La forma más rápida de hacer scraping de TripAdvisor en 2026 es llamar a una API estructurada que devuelve JSON normalizado — búsqueda de hoteles, restaurantes y atracciones, detalles de lugares y reviews — en lugar de hacer ingeniería inversa de los endpoints GraphQL de TripAdvisor y pelear contra su stack anti-bot. Puedes construir un scraper DIY, pero TripAdvisor está bien defendido y su API oficial omite el texto de las reviews que la mayoría quiere. Esta guía cubre los tres enfoques, qué devuelve cada uno, dónde falla cada uno y los aspectos legales básicos.
¿Por qué hacer scraping de TripAdvisor?
TripAdvisor es una de las mayores fuentes de datos de viajes, lo que la hace valiosa para:
- Análisis de mercado de hoteles y restaurantes — sigue ratings, rankings y precios en un destino.
- Análisis de reviews y sentimiento — cuantifica qué elogian y critican los huéspedes.
- Inteligencia competitiva — compara una propiedad con su ranking local y sus pares.
- Contenido y productos de viajes — impulsa investigación de destinos, atracciones y "cosas que hacer".
¿Es legal hacer scraping de TripAdvisor?
Opción 1: DIY en Python (y por qué falla)
TripAdvisor carga los datos de búsqueda y listados mediante GraphQL, así que un scraper DIY hace ingeniería inversa de esas llamadas:
import httpx
# TripAdvisor's typeahead runs on a GraphQL endpoint keyed by a rotating query id
payload = [{"variables": {"request": {"query": "New York", "limit": 10, "locale": "en-US"}},
"query": "84b17ed122fbdbd4"}] # preRegisteredQueryId — changes over time
r = httpx.post("https://www.tripadvisor.com/data/graphql/ids", json=payload, http2=True,
headers={"Origin": "https://www.tripadvisor.com",
"Referer": "https://www.tripadvisor.com/Hotels",
"X-Requested-By": "<random-tracking-id>"}) # required, or you're blocked
Funciona en la demo y luego falla:
- DataDome + Cloudflare. TripAdvisor ejecuta detección de bots DataDome detrás de un WAF de Cloudflare con TLS fingerprinting y desafíos de JavaScript; las IPs de datacenter provocan CAPTCHAs y 403, así que necesitas proxies residenciales y una tasa baja (unas 10 peticiones/minuto con retrasos de 3–7s).
- Query ids de GraphQL rotativos. Los datos están detrás de llamadas a
/data/graphql/idsreferenciadas por unpreRegisteredQueryIdque cambia, más los headers requeridosOrigin/Referer/X-Requested-By— cuando el id rota, tu scraper deja de devolver datos. - Datos web ocultos y selectores que cambian. El detalle de hoteles y reviews está incrustado como JSON en la página (los bloques de script
aggregateRating), las reviews paginan mediante offsets de URL-orN-, y los hooksdata-test-targetcambian sin previo aviso. - La API oficial no llena el vacío. La Content API de TripAdvisor da ~5.000 llamadas gratis/mes (tarjeta de crédito requerida) pero devuelve ratings y links — no el texto completo de las reviews — así que el contenido que la gente realmente quiere sigue implicando scraping.
Opción 2: Herramientas no-code
Los extractores visuales y los "actors" de marketplace tipo "TripAdvisor reviews" exportan CSV/JSON y sirven para extracciones puntuales, pero son incómodos en un pipeline de producto con campos predecibles y se rompen con el mismo desgaste anti-bot.
Opción 3: Una API estructurada de TripAdvisor
Para flujos de trabajo repetibles, una TripAdvisor scraping API devuelve JSON normalizado sin necesidad de ejecutar un navegador. Resuelve primero una ubicación:
curl "https://api.crawlora.net/api/v1/tripadvisor/autocomplete?q=New%20York" \
-H "x-api-key: $CRAWLORA_API_KEY"
Luego encadena autocomplete → search → reviews en Python:
import requests
h = {"x-api-key": "YOUR_API_KEY"}
base = "https://api.crawlora.net/api/v1/tripadvisor"
# 1) resolve a location to a geo_id
geo = requests.get(f"{base}/autocomplete", headers=h, params={"q": "New York"}).json()["data"]["results"][0]
geo_id = geo["id"]
# 2) search hotels (or restaurants / attractions) in that geo
hotels = requests.get(f"{base}/search", headers=h,
params={"geo_id": geo_id, "type": "hotel", "limit": 20}).json()["data"]["results"]
# 3) pull a place's reviews by its own id
place_id = hotels[0]["id"]
reviews = requests.get(f"{base}/reviews", headers=h,
params={"id": place_id, "page": 1, "language": "en"}).json()["data"]["reviews"]
Una respuesta de reviews es JSON normalizado que puedes almacenar directamente (los campos son ilustrativos — revisa los docs):
{
"code": 200,
"msg": "OK",
"data": {
"id": "113311",
"page": 1,
"language": "en",
"total": 1517,
"reviews": [
{
"id": "1060008752",
"title": "Outstanding weekend",
"text": "Excellent stay with attentive service.",
"author": "Jane D.",
"date": "May 2026",
"rating": 5,
"helpful_votes": 1,
"photos": ["https://dynamic-media-cdn.tripadvisor.com/media/photo.jpg"]
}
]
}
}
Los resultados de búsqueda incluyen id, title, type, url, rating, review_count, rank_label, price_level, address, categories y booking_url. Usa /tripadvisor/hotels para resultados específicos de hoteles con price/star_rating, /tripadvisor/place para el detalle completo de un lugar, y /tripadvisor/enums para los valores válidos de type/sort. Las reviews paginan mediante page; pasa language y sort_by. Guarda una fila por review y vuelve a extraer según un calendario.
Qué puedes recopilar
Donde las páginas públicas los exponen: autocomplete de ubicación (geo ids y padres), resultados de búsqueda para hoteles, restaurantes y atracciones (rating, review_count, rank_label, price_level o price, categories, booking_url), detalle de lugar (address, images, rating, total de reviews) y reviews (title, text, author, date, rating, helpful_votes, photos) — acotado por geo y locale/moneda. Cíñete a campos públicos y factuales.
Limitaciones y desafíos comunes
- No hay un camino oficial sencillo al texto de las reviews. La Content API tiene un tope de ~5.000 llamadas/mes (tarjeta requerida) y omite el texto completo de las reviews, y el scraping directo provoca CAPTCHAs de DataDome/Cloudflare a escala — una API estructurada absorbe proxies y anti-bot detrás de una sola key.
- geo_id vs. place id. Las ubicaciones se direccionan por un
geo_id(del autocomplete); los hoteles, restaurantes y atracciones individuales por su propioid— resuelve primero la geo. - Las reviews son por locale y son datos personales. Las reviews están ligadas a un idioma/locale, y los nombres de autor más el texto de la review son datos personales bajo GDPR/CCPA — recopila campos públicos y factuales con una base legal.
- Rankings y precios son dinámicos. Las etiquetas de ranking y los precios por noche cambian, así que vuelve a extraer según un calendario en lugar de confiar en una instantánea puntual.
Dónde se usa esto
- Investigación de viajes y hospitalidad — sigue hoteles, restaurantes y atracciones en distintos destinos. Ver el caso de uso travel & hospitality research.
- Monitoreo de reviews y reputación — observa ratings y sentimiento de reviews de una propiedad. Ver review & reputation monitoring.
- Análisis de mercado y competitivo — compara un establecimiento con su ranking local y sus pares.
Sources
Empieza a recopilar
Pruébalo primero, gratis: ejecuta cualquier URL pública en el Free Web Scraper, o comprueba si un sitio bloquea bots con el Anti-Bot Checker — sin registro.
Prueba los endpoints de search y reviews en el Playground, revisa el schema en los API docs, y consulta el pricing. Ver también how to scrape Airbnb para el resto del stack de viajes, how to scrape Trustpilot reviews y how to scrape App Store reviews para más fuentes de reviews, how to choose a web scraping API, y is web scraping legal.
Parte de nuestra serie de guías how-to-scrape — todas las plataformas que cubrimos, en un solo índice.
Preguntas frecuentes
¿Puedo hacer scraping de TripAdvisor sin que me bloqueen?
TripAdvisor ejecuta detección de bots DataDome detrás de un WAF de Cloudflare con TLS fingerprinting y desafíos de JavaScript, así que las IPs de datacenter provocan CAPTCHAs y 403 — el DIY necesita proxies residenciales y una tasa lenta (unas 10 peticiones/minuto). Una API estructurada se encarga de los proxies y el anti-bot detrás de una sola key para datos públicos de búsqueda y reviews.
¿TripAdvisor tiene una API oficial?
Sí, pero es limitada. La Content API de TripAdvisor da alrededor de 5.000 llamadas gratis/mes (se requiere tarjeta de crédito) y devuelve ratings y links — no el texto completo de las reviews — así que obtener el contenido de reviews que la gente realmente quiere sigue implicando scraping.
¿Cómo obtengo las reviews de un hotel o restaurante?
Resuelve la ubicación con /tripadvisor/autocomplete para obtener un geo_id, busca en esa geo con /tripadvisor/search (type hotel, restaurant o attraction) para obtener el id de un lugar, y luego llama a /tripadvisor/reviews con ese id. Las reviews paginan mediante page y aceptan language y sort_by.
¿Cuál es la diferencia entre un geo_id y un place id?
Un geo_id identifica una ubicación (ciudad, región) y proviene del autocomplete; un place id identifica un hotel, restaurante o atracción específico y proviene de los resultados de búsqueda. Primero resuelves la geo y luego direccionas el lugar por su propio id.
¿Qué datos de TripAdvisor puedo recopilar?
Campos públicos: autocomplete de ubicación, resultados de búsqueda de hoteles/restaurantes/atracciones (rating, review_count, rank_label, price_level, categories, booking_url), detalle de lugar (address, images, rating) y reviews (title, text, author, date, rating, helpful_votes, photos) — acotados por geo y locale.
¿Las reviews de TripAdvisor son datos personales?
Sí. Los nombres de autor y el texto de las reviews son datos personales bajo GDPR/CCPA — recopila solo campos públicos y factuales con una base legal, y no vuelvas a publicar la identidad de los reviewers.
¿Con qué frecuencia puedo actualizar los datos?
Los rankings y los precios cambian, así que vuelve a extraer los datos según un calendario dentro de los límites de tu plan y del uso responsable, en lugar de consultar de forma continua.