Cómo Extraer Reseñas Online en JSON: Yelp, Tripadvisor, Booking y Más
Las reseñas te cuentan cosas que ninguna página de producto te dirá. Por qué los huéspedes se van descontentos de un hotel. Qué función hace que los compradores cambien de software. Qué piensan de verdad los empleados de una empresa. Si quieres esa señal a escala, necesitas las reseñas como datos, no como una página web por la que haces scroll.
Recopilarlas es más difícil de lo que parece. Esta guía explica por qué, qué plugins de reseñas puedes usar para obtener los datos como JSON limpio, cómo vigilar las reseñas nuevas de forma programada y cómo unir reseñas de distintos sitios en un solo dataset.
Por Qué Es Difícil Extraer Reseñas por Tu Cuenta
Cada sitio de reseñas te pone trabas de una forma un poco distinta:
- En el HTML solo hay unas pocas reseñas. La página de un negocio en Yelp o de un alojamiento en Airbnb muestra un puñado de reseñas. El resto se carga página a página desde la API interna del propio sitio, así que tu parser de HTML apenas ve nada.
- La paginación es la parte cara. Tripadvisor sirve 10 reseñas por página. Para conseguir 200 reseñas cargas 20 páginas, y cada página es una nueva oportunidad de que te bloqueen.
- Los sistemas anti-bot protegen las mejores fuentes. Varios de los grandes sitios de reseñas están detrás de protecciones comerciales contra bots como DataDome o Cloudflare. Una simple llamada con
requestsrecibe una página de desafío en lugar de reseñas. - Los muros de login ocultan parte de los datos. Amazon solo muestra su lista completa de reseñas a clientes con sesión iniciada. Glassdoor muestra tres reseñas por vista a los visitantes sin sesión.
- Cada sitio tiene su propio esquema. Booking.com puntúa sobre 10 y divide el texto en “lo que gustó” y “lo que no gustó”. Glassdoor tiene pros y contras. Yelp tiene un solo campo de texto. Acabas escribiendo un parser por sitio y arreglándolo cada vez que cambia el marcado.
Si ya has construido un scraper de reseñas, sabes que el parser es la parte fácil. El trabajo real es obtener las páginas de forma fiable.
Los Plugins de Reseñas de un Vistazo
ScrapeUnblocker tiene un conjunto de plugins de reseñas que reciben un negocio, un producto o un alojamiento y devuelven sus reseñas ya procesadas. Envías una petición POST y recibes JSON. Sin cuenta en el sitio de reseñas, sin login, sin selectores CSS.
| Plataforma | Endpoint | Reseñas por llamada | A tener en cuenta |
|---|---|---|---|
| Yelp | /local/yelp-reviews | hasta 500 | Todas las páginas de reseñas, un idioma por llamada |
| Tripadvisor | /travel/tripadvisor-reviews | hasta 200 | Hoteles, restaurantes y atracciones, respuestas del propietario |
| Airbnb | /travel/airbnb-reviews | hasta 500 | Todas las reseñas, con la traducción de Airbnb |
| Booking.com | /travel/booking-reviews | hasta 270 | Las 15 más recientes por idioma, 18 idiomas |
| Amazon | /marketplace/amazon-reviews | las 5 a 13 destacadas | Valoración, histograma de estrellas y el resumen “Customers say” |
| Glassdoor | /reviews/glassdoor | hasta 25 | Una muestra pública, solo el sitio de EE. UU. |
| Capterra | /reviews/capterra | hasta 500 | Pros, contras y motivos para cambiar |
| Trustpilot | /reviews/trustpilot | 20 por página | TrustScore, desglose por estrellas y respuestas de la empresa |
Cada plugin tiene su propia página en el catálogo de scrapers con la lista completa de campos, una respuesta de ejemplo y su benchmark público.
Tu Primera Llamada
Este es el plugin de Yelp en Python. El parámetro business acepta una URL de Yelp, el alias del negocio o su id:
import os
import requests
resp = requests.post(
"https://api.scrapeunblocker.com/local/yelp-reviews",
headers={"X-ScrapeUnblocker-Key": os.environ["SU_API_KEY"]},
params={"business": "gary-danko-san-francisco", "max_reviews": "20", "sort": "newest"},
timeout=180,
)
resp.raise_for_status()
data = resp.json()
biz = data["business"]
print(biz["name"], biz["rating"], biz["reviewCount"], biz["ratingHistogram"])
for review in data["reviews"]:
print(review["date"], review["rating"], review["text"][:80])
La respuesta tiene dos partes. business es el resumen: valoración, número de reseñas, el histograma de 1 a 5 estrellas y el número de reseñas por idioma. reviews es la lista en sí, cada una con id, valoración, texto completo, fecha, autor, fotos, reacciones y la respuesta del propietario.
La paginación funciona igual en todos los plugins. Pides un número de reseñas con max_reviews o max_results, y la respuesta te dice si hay más (hasMore) y desde dónde continuar (nextStart en Yelp, nextPage en Tripadvisor y Capterra, nextPage o nextOffset en Airbnb). También informa de pagesFetched, que es lo que se te factura.
Vigila las Reseñas Nuevas de Forma Programada
La mayoría de los proyectos de reseñas no son descargas puntuales. Quieres saber cuándo llega una reseña nueva, sobre todo si es mala. El patrón que funciona:
- Pide primero las reseñas más recientes (
sort=newesten Yelp,sort=most_recenten Airbnb; Tripadvisor ya ordena de más nueva a más antigua por defecto). - Mantén el lote pequeño, porque solo necesitas lo que ha cambiado desde la última ejecución.
- Guarda cada id de reseña que ya hayas visto y actúa solo sobre los ids nuevos.
- Cuando el plugin lo permita, pasa una fecha
sincepara descartar las reseñas antiguas antes de que te lleguen.
Booking.com está hecho exactamente para esto. Solo expone las 15 reseñas más recientes por idioma, así que lo consultas periódicamente y pasas since como fecha YYYY-MM-DD.
import os
import sqlite3
from datetime import date, timedelta
import requests
API = "https://api.scrapeunblocker.com"
HEADERS = {"X-ScrapeUnblocker-Key": os.environ["SU_API_KEY"]}
since = (date.today() - timedelta(days=7)).isoformat()
TARGETS = [
("yelp", "/local/yelp-reviews",
{"business": "gary-danko-san-francisco", "sort": "newest", "max_reviews": "20"}),
("tripadvisor", "/travel/tripadvisor-reviews",
{"url": "https://www.tripadvisor.com/Hotel_Review-g60763-d93589-Reviews-The_Michelangelo_New_York-New_York_City_New_York.html",
"max_reviews": "20"}),
("airbnb", "/travel/airbnb-reviews",
{"room": "35283352", "sort": "most_recent", "max_reviews": "50"}),
("booking", "/travel/booking-reviews",
{"hotel": "gb/the-savoy", "languages": "en,de", "since": since}),
]
db = sqlite3.connect("reviews.db")
db.execute("CREATE TABLE IF NOT EXISTS seen (platform TEXT, id TEXT, PRIMARY KEY (platform, id))")
for platform, path, params in TARGETS:
r = requests.post(API + path, headers=HEADERS, params=params, timeout=180)
r.raise_for_status()
data = r.json()
new = []
for review in data.get("reviews", []):
cur = db.execute("INSERT OR IGNORE INTO seen VALUES (?, ?)", (platform, str(review["id"])))
if cur.rowcount:
new.append(review)
db.commit()
print(f"{platform}: {len(new)} new reviews, {data.get('pagesFetched')} pages billed")
Ejecútalo una vez al día desde cron o cualquier otro programador de tareas. La primera ejecución llena la tabla; cada ejecución posterior solo informa de lo nuevo. A partir de ahí, envía las valoraciones bajas a Slack o por email, o carga todo en tu data warehouse.
Une las Reseñas en un Solo Esquema
En cuanto sigues varias plataformas, quieres una tabla, no siete. Las diferencias son pequeñas pero reales: Booking.com puntúa sobre 10, Amazon llama body a su texto, Glassdoor y Capterra lo dividen en pros y contras, y el campo de respuesta tiene un nombre distinto en cada sitio. Una pequeña tabla de mapeo lo resuelve:
FIELDS = {
# platform: (text fields, date field, author path, reply field, rating scale)
"yelp": (["text"], "date", ("user", "name"), "ownerResponse", 5),
"tripadvisor": (["title", "text"], "publishedDate", ("user", "name"), "ownerResponse", 5),
"airbnb": (["text"], "date", ("reviewer", "name"), "response", 5),
"booking": (["title", "positiveText", "negativeText"], "reviewDate", ("reviewer", "name"), None, 10),
"amazon": (["title", "body"], "date", ("author",), None, 5),
"glassdoor": (["title", "pros", "cons"], "date", ("jobTitle",), "employerResponse", 5),
"capterra": (["title", "comments", "pros", "cons"], "date", ("reviewer", "name"), "vendorResponse", 5),
}
def normalize(platform, r):
text_fields, date_field, author_path, reply_field, scale = FIELDS[platform]
author = r
for key in author_path:
author = author.get(key) if isinstance(author, dict) else None
return {
"platform": platform,
"id": str(r["id"]),
"rating": round(r["rating"] / scale * 5, 1) if r.get("rating") is not None else None,
"text": "\n\n".join(r[f] for f in text_fields if r.get(f)),
"date": (r.get(date_field) or "")[:10],
"author": author,
"replied": bool(reply_field and r.get(reply_field)),
}
Ahora cada reseña tiene una valoración en escala de 1 a 5, un único campo de texto, una fecha ISO y un indicador replied. Es suficiente para dashboards, alertas y análisis de sentimiento sobre todas tus fuentes.
Qué Puedes Construir con Datos de Reseñas
- Monitorización de reputación para hoteles y restaurantes. Sigue las reseñas nuevas de Tripadvisor, Booking.com, Airbnb y Yelp en un solo sitio, recibe alertas de valoraciones bajas y mide con qué frecuencia y rapidez responde el propietario frente a los competidores cercanos.
- Investigación de producto en Amazon. Los datos de “Customers say” enumeran los aspectos de los que hablan los compradores (calidad, ajuste, sonido) con su sentimiento y número de menciones. Compáralos entre productos competidores para ver qué punto débil puedes resolver.
- Inteligencia competitiva en SaaS. Las reseñas de Capterra incluyen los motivos para elegir un producto, los motivos para cambiar y los productos que dejó el comprador. Usa
mode=searchcon una palabra clave comocrmpara encontrar todos los productos de una categoría, y luego mira quién pierde clientes frente a quién, y por qué. - Investigación sobre empleadores. Las reseñas de Glassdoor incluyen seis subvaloraciones, la aprobación del CEO y las perspectivas del negocio. Sigue cómo evolucionan para tu empresa y para las empresas con las que compites al contratar.
- Sentimiento multilingüe. Booking.com devuelve reseñas en hasta 18 idiomas, y Airbnb devuelve su propia traducción junto al texto original, así que puedes analizarlo todo en un solo idioma.
- Datasets para IA. Las reseñas normalizadas son una entrada limpia para un LLM que extraiga temas, resuma quejas o etiquete peticiones de funciones.
Conoce los Límites Antes de Construir
Los plugins devuelven lo que cada sitio muestra públicamente, y eso varía mucho:
- Amazon devuelve la parte pública de la página de producto: valoración, histograma, “Customers say” y las reseñas destacadas. Cuando Amazon muestra un aviso de inicio de sesión en lugar de reseñas,
reviewsGatedes true y la lista viene vacía. No es una exportación completa. - Glassdoor muestra tres reseñas por vista a los visitantes sin sesión. El plugin combina varios órdenes y filtros por estrellas para llegar hasta 25 por llamada. Trátalo como una muestra, no como un historial.
- Booking.com da las 15 reseñas más recientes por idioma. El indicador
cappedte avisa cuando existen reseñas más antiguas a las que no se puede llegar. - Yelp lista un idioma de reseñas por llamada.
reviewsCountByLanguagete dice si merece la pena otra pasada. - Capterra solo ofrece su orden Most Helpful, sin filtro de fecha, y se detiene en 100 páginas por producto.
La facturación sigue las páginas que sirve cada sitio: una petición por cada 10 reseñas en Yelp, por página de reseñas en Tripadvisor (10 reseñas, 15 en restaurantes), por cada 50 en Airbnb, por cada 25 en Capterra, por idioma en Booking.com y por vista en Glassdoor. Revisa pagesFetched en cada respuesta y ajusta max_reviews a lo que realmente necesitas.
Una cosa más: los nombres y perfiles de quienes escriben reseñas pueden ser datos personales. Guarda solo lo que tu caso de uso necesita. Nuestra guía sobre si el web scraping es legal cubre lo básico.
Preguntas Frecuentes
¿Puedo obtener todas las reseñas de un negocio? En Airbnb y Yelp, sí: los plugins recorren todas las reseñas, hasta 500 por llamada. Tripadvisor da hasta 200 por llamada y continúas con la página siguiente. Capterra llega hasta 100 páginas de 25. Amazon, Glassdoor y Booking.com solo exponen una parte pública, así que obtienes una muestra o las reseñas más recientes.
¿Cómo recojo solo las reseñas nuevas?
Ordena de más nueva a más antigua, mantén cada ejecución pequeña, guarda los ids de reseña que ya has visto y pasa una fecha since donde el plugin lo permita. El script de monitorización de arriba hace exactamente eso.
¿Necesito una cuenta en el sitio de reseñas? No. Ninguno de los plugins inicia sesión ni necesita una clave de API de partner. Leen lo que el sitio muestra a un visitante sin sesión.
¿Cuánto cuesta? Cada página facturada es una petición, y una petición es un crédito: 1,00 EUR por cada 1.000 en pago por uso, hasta unos 0,55 EUR por cada 1.000 en el plan Ultimate. Las peticiones bloqueadas y los timeouts no se facturan.
Cómo Empezar
Los datos de reseñas solo son útiles si siguen llegando. Las partes difíciles son los muros anti-bot, la paginación y los cambios de esquema, y eso es justo lo que los plugins te quitan de encima, para que dediques tu tiempo al análisis.
Explora los plugins de reseñas en el catálogo de scrapers de ScrapeUnblocker, luego crea una cuenta gratuita y ejecuta el primer ejemplo de arriba con tu propio negocio o producto. La prueba gratuita incluye 500 peticiones, sin tarjeta.
Prueba ScrapeUnblocker gratis
Tasa de éxito del 95%+ · desde 0,55 € por cada 1000 llamadas · 500 solicitudes gratis al registrarte.