Tony Wang4 min de lecturaCómo scrapear OpenTable: datos de restaurantes y reservas en 2026 (API y Python)
Scrapea la búsqueda, perfiles, menús, reviews y timeslots en vivo de OpenTable en 2026 — DIY, sin código o API estructurada — con lo legal.
La forma más rápida de scrapear datos de restaurantes y reservas de OpenTable en 2026 es llamar a una API estructurada que devuelva JSON normalizado — perfiles de restaurantes, menús, reviews de comensales y timeslots reservables en vivo — en lugar de hacer ingeniería inversa del flujo interno de reservas de OpenTable. Esta guía cubre los tres enfoques, qué devuelve cada uno, dónde falla cada uno y los aspectos legales básicos.
¿Por qué scrapear OpenTable?
OpenTable centraliza el descubrimiento de restaurantes, los menús, las reviews y la disponibilidad en vivo, lo que lo hace útil para:
- Monitoreo de disponibilidad de reservas — detecta cuándo se libera una mesa en un restaurante difícil de reservar.
- Investigación de mercado de restaurantes y hospitalidad — cobertura de tipo de cocina, rango de precios y ubicación en un área metropolitana.
- Análisis de reviews y sentimiento — ratings de comensales por categoría (comida, servicio, ambiente, relación calidad-precio, ruido).
- Benchmarking de menús y precios — compara platos y precios entre restaurantes.
¿Es legal scrapear OpenTable?
Opción 1: DIY en Python (y por qué falla)
Las páginas de restaurantes de OpenTable y el widget de disponibilidad en vivo se apoyan en una API interna de reservas, así que un scraper casero es, en realidad, ingeniería inversa de ese flujo:
import requests
# OpenTable's live-availability widget calls an internal booking API,
# not a documented public endpoint
resp = requests.get("https://www.opentable.com/s?term=dinner&latitude=37.7749&longitude=-122.4194")
Funciona en la demo y luego falla:
- No hay una API pública oficial. OpenTable no publica una API para desarrolladores que permita acceso de terceros a la búsqueda o a la disponibilidad, así que no hay endpoint documentado ni key — estás replicando las llamadas privadas del sitio y de la app para consumidores.
- La disponibilidad en tiempo real es la parte difícil. Los timeslots cambian a medida que se reservan y liberan mesas, así que un snapshot scrapeado queda obsoleto en minutos — necesitas volver a consultar con un ritmo muy ajustado, exactamente el patrón de carga que los sistemas anti-bot detectan.
- Defensas anti-bot. Las solicitudes automatizadas repetidas a los endpoints de búsqueda y disponibilidad generan límites de tasa y bloqueos, lo que exige headers realistas, proxies y mantenimiento constante.
- Esquema interno cambiante. La forma de la respuesta de la API interna de reservas cambia sin aviso y rompe las consultas replicadas.
Opción 2: Herramientas sin código
Los "actors" de marketplace tipo "OpenTable scraper" exportan CSV/JSON y sirven para extracciones puntuales, pero resultan incómodos dentro de un pipeline de producto — sobre todo para cualquier cosa que trackee disponibilidad en vivo — y heredan la misma fragilidad de la API interna.
Opción 3: Una API estructurada de OpenTable
Para flujos de trabajo repetibles, una OpenTable scraping API devuelve JSON normalizado sin ningún flujo interno de reservas que mantener. Busca por término, ubicación, fecha/hora y tamaño del grupo — con la disponibilidad en vivo incluida inline:
curl "https://api.crawlora.net/api/v1/opentable/search?term=dinner&latitude=37.7749&longitude=-122.4194&party_size=2" \
-H "x-api-key: $CRAWLORA_API_KEY"
Luego resuelve el id de un restaurante y obtén su perfil, menú y reviews en Python:
import requests
h = {"x-api-key": "YOUR_API_KEY"}
base = "https://api.crawlora.net/api/v1/opentable"
results = requests.get(f"{base}/search", headers=h,
params={"term": "dinner", "latitude": 37.7749, "longitude": -122.4194}).json()["data"]["results"]
rid = results[0]["id"]
restaurant = requests.get(f"{base}/restaurant", headers=h,
params={"restaurant_id": rid, "party_size": 2}).json()["data"]
menus = requests.get(f"{base}/restaurant/menus", headers=h,
params={"restaurant_id": rid}).json()["data"]["menus"]
reviews = requests.get(f"{base}/restaurant/reviews", headers=h,
params={"restaurant_id": rid, "page": 1}).json()["data"]["reviews"]
La respuesta con el perfil de un restaurante es JSON normalizado que puedes almacenar directamente (campos reales):
{
"code": 200,
"msg": "OK",
"data": {
"id": "131459",
"name": "El Gaucho Argentinian Steakhouse - Hai Ba Trung",
"city": "Ho Chi Minh city",
"dining_style": "Casual Dining",
"cuisines": [{ "id": "029cd931-...", "name": "Steak" }],
"timeslots": [{ "date_time": "2026-08-04T19:00", "available": true, "price_amount": null, "token": "..." }]
}
}
Las reviews llegan con ratings por categoría, no solo un score general:
{ "id": "OT-131459-908-...", "reservation_date": "2026-05-29T13:45", "author": "kim", "text": "Australian beef, top notch.", "recommended": true, "statistics": { "overall_rating": 5.0, "food": 5.0, "service": 5.0, "ambience": 5.0, "value": 4.0, "noise": 3.0 } }
Guarda una fila por restaurante (o por chequeo de timeslot, para monitoreo de disponibilidad) y vuelve a consultar con una frecuencia acorde a la rapidez real con la que cambia la disponibilidad.
Qué puedes recopilar
Campos públicos: resultados de búsqueda de restaurantes con disponibilidad en vivo inline (id, name, location, cuisines, timeslots); perfil del restaurante (location, hours, price band, dining style, dress code, features, review summary); timeslots reservables en tiempo real (date/time, availability, price según el tamaño del grupo); menús (sections, items, prices); y reviews de comensales con ratings por categoría (overall, food, service, ambience, value, noise).
Limitaciones y desafíos comunes
- No hay API oficial para desarrolladores. El acceso de terceros a la búsqueda y a la disponibilidad implica scrapear el flujo interno de reservas de OpenTable, algo que una API estructurada gestiona detrás de una sola key.
- La disponibilidad es un blanco móvil. Los timeslots reflejan un momento puntual — para monitorear "¿se libera una mesa?", consulta según un calendario en lugar de confiar en una sola extracción.
- Las reviews son datos personales. Los nombres de autor, el texto de la review y la ubicación del área metropolitana son datos personales bajo el RGPD/CCPA — recopila campos públicos y factuales con una base legal.
- Anti-bot ante consultas repetidas. Las solicitudes automatizadas frecuentes al mismo restaurante generan límites de tasa — una API estructurada absorbe esto detrás de la key.
Dónde se usa esto
- Monitoreo de disponibilidad de reservas — avisa cuando aparece una cancelación en un restaurante completo. Consulta el caso de uso travel & hospitality research.
- Investigación de mercado de restaurantes — densidad de tipos de cocina, rangos de precios y cobertura en un área metropolitana.
- Monitoreo de reviews y reputación — sentimiento de los comensales por categoría a lo largo del tiempo. Consulta el caso de uso review & reputation monitoring.
Fuentes
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 el endpoint de búsqueda en el Playground, revisa el schema en los API docs y consulta los pricing. Consulta también how to scrape Yelp para ratings de negocios locales, how to scrape TripAdvisor para reviews de viajes y locales, mobile app APIs explained para entender cómo fluyen realmente estos datos, y is web scraping legal.
Esta guía forma parte de nuestra serie de guías how-to-scrape — todas las plataformas que cubrimos, en un solo índice.
Preguntas frecuentes
¿OpenTable tiene una API oficial?
No hay una API pública para desarrolladores que permita acceso de terceros a la búsqueda o a la disponibilidad. Recopilar los datos de restaurantes, menús, reviews y timeslots de OpenTable implica scraping — algo que una API estructurada gestiona detrás de una key y devuelve como JSON normalizado, sin que tengas que mantener un flujo interno de reservas.
¿Qué tan actualizados están los datos de disponibilidad?
Los timeslots reflejan un momento puntual y cambian a medida que se reservan y liberan mesas. Para casos de monitoreo ("avísame cuando se libere una mesa"), consulta según un calendario acorde a la rapidez real con la que cambia la disponibilidad, en lugar de confiar en un solo snapshot.
¿Cómo identifico un restaurante de OpenTable?
Los restaurantes se identifican con un id numérico de OpenTable, que devuelve el endpoint de búsqueda junto con los mismos campos de ubicación y disponibilidad en vivo que el endpoint de detalle del restaurante.
¿Qué datos de OpenTable puedo recopilar?
Campos públicos: búsqueda de restaurantes con disponibilidad en vivo inline; perfil del restaurante (location, hours, price band, dining style, features, review summary); timeslots reservables en tiempo real; menús (sections, items, prices); y reviews de comensales con ratings por categoría (food, service, ambience, value, noise).
¿Las reviews de OpenTable son datos personales?
Sí. Los nombres de autor, el texto de la review y la ubicación del área metropolitana son datos personales bajo el RGPD/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?
Vuelve a extraer los datos según un calendario dentro de tu plan y de los límites de uso responsable — con un ritmo más ajustado para el monitoreo de disponibilidad en vivo, y más espaciado para el seguimiento de reviews/sentimiento.