SPAB — Retrieval de huecos: qué cerró hoy, qué sigue y por qué
Fecha: 2026-09-14 · Proyecto: ~/nef/estado_turismo/spab-retrieval
Continúa 2026-09-14-spab-huecos-datos.md y 2026-09-14-spab-clustering-resultado.md.
Cerrado hoy
1. Tulum → ocupación hotelera, vía proxy “Riviera Maya”.
Verificado en vivo contra el xlsx real de junio 2026: la fila RIVIERA MAYA, Q. ROO existe como agregado regional en el Monitoreo Hotelero — no era
hipotético. Se agregó a scripts/ocupacion_desde_monitoreo.py (MAPA),
marcado con n=0 (cero muestra propia de Tulum, no “sin dato”). Se propagó
el campo n a través de data/raw/datatur.csv → conector oficiales.ts →
Observacion.n. tsc limpio.
Corrida: 24 meses de ocupación para Tulum (2024-2026). Re-corrido
clustering_estacional.py: Tulum entra al clúster 0 — playa de invierno
(cancún, playa del carmen, puerto vallarta, puerto escondido), mismo pico
feb, mismo valle sep. 9/10 destinos ya tienen ocupación.
2. Bacalar → confirmado sin proxy en esta fuente. No aparece ni suelto ni en ningún agregado regional del Monitoreo (se listó la tabla completa de “Centro”, 75 filas). No es un hueco de configuración: es un hueco real de la fuente. Sigue fuera del clustering estacional, declarado.
3. anfitriones_multi / precio Airbnb (9 destinos) → confirmado dead-end
estructural. Inside Airbnb publica una sola ciudad de México: CDMX.
Verificado en vivo contra insideairbnb.com/get-the-data (sept 2026). No es
cuestión de completar claves.insideairbnb en destinos.json — la fuente
no tiene el dato para los otros 9. Cierra la duda; el precio ya se cubre por
booking (10/10, ver más abajo) y anfitriones_multi queda como hueco
estructural sin retrieval posible por esta vía (ver alternativa abajo).
4. Precio (precio_hospedaje) — ya estaba resuelto, no es hueco.
booking:10 en data/base/observaciones.csv — el módulo #1 del documento
de huecos anterior (Playwright/Booking directo) ya corre. No requiere acción.
Sigue abierto — con la vía de retrieval identificada
| # | Hueco | Vía de retrieval | Bloqueo real |
|---|---|---|---|
| SESNSP | delitos_100k, 0/10 | Encontrado el link real (ver abajo) | Requiere navegador con sesión Microsoft — curl da 302 a un ZIP pero SharePoint exige login; no es scripteable sin credenciales. 1 clic manual, 30s. |
| AFAC | asientos, 3/10 (solo OpenSky parcial) | Encontrado el link real (ver abajo) | Detrás de un challenge anti-bot (F5/Akamai, JS real) — mismo patrón que Booking y DataTur. 1 descarga manual, 30s. |
| Sargazo | severidad, 0/10 | NOAA PDF/imagen → NLP sobre reseñas Places | Secundario, no bloquea el resultado principal |
anfitriones_multi | 1/10 (solo CDMX) | Sin fuente viva | Evaluado (ver abajo) — no hay proxy limpio con lo que ya se captura |
SESNSP — el link real (sept 2026)
Página: gob.mx/sesnsp/acciones-y-programas/datos-abiertos-de-incidencia-delictiva
Ahí hay dos enlaces SharePoint (“Enero-julio 2026”), uno de delitos y uno de
víctimas, ambos municipales. curl con ?download=1 sí resuelve el nombre
real del archivo (RNID-Delitos_Municipal-2026-jul2026.zip) pero SharePoint
devuelve una pantalla de login — no es descargable sin sesión.
Acción para Nef: abrir el link de “Delitos” en el navegador, descargar el
zip, extraer el csv/xlsx, y depositarlo como data/raw/sesnsp.csv con las
columnas de data/plantillas/sesnsp.csv (cve_municipio,anio,mes,delitos, poblacion) — el cve_municipio de cada destino ya está en destinos.json
(claves.sesnsp_cve_mun), no falta mapeo, solo el archivo.
AFAC — el link real, y por qué falla en automático (sept 2026)
Página: gob.mx/afac/acciones-y-programas/estadistica-operacional-de-aerolineas-traffic-statistics-by-airline-253114.
Dos xlsx ahí: sase-*.xlsx (origen-destino) y resumen-*.xlsx (por
aerolínea) — el primero es el candidato para asientos por ruta. curl
contra la URL exacta del archivo devuelve un “Challenge Validation”
(reto criptográfico JS, tipo el 202 que ya se documentó para Booking) — no
es 404 ni requiere login, es anti-bot puro. Un navegador real lo pasa solo.
Acción para Nef: abrir la página, bajar sase-*.xlsx a mano, revisar si
trae asientos por IATA separados doméstico/internacional (no verificado —
el challenge impidió leer las columnas), y depositarlo como
data/raw/aero.csv con columnas iata,anio,mes,asientos,tipo.
anfitriones_multi — por qué NO hay proxy hoy
La idea obvia era: razón cadena/independiente de los lugares que ya trae Google Places. No sirve, por dos razones verificadas contra el código:
- El conector no pide el nombre del lugar.
googleplaces.tssolo declaraX-Goog-FieldMask: rating,userRatingCount,reviews— sindisplayNameno hay con qué clasificar cadena vs. independiente. Se puede agregar, pero es una llamada nueva a Places, no un derivado de lo que ya hay. - Es una métrica distinta, no un proxy del mismo hecho.
anfitriones_multimide concentración de anfitriones de renta corta (Airbnb); una razón de cadenas hoteleras en Places mide otra cosa — turistificación de la oferta hotelera formal, no de Airbnb. Meterlo bajo el mismo nombre de métrica sería exactamente lo que la regla anti-basura del esquema prohíbe: nunca declarar que un número mide una cosa cuando mide otra.
Si se quiere esta señal, el camino honesto es una métrica nueva
(concentracion_hotelera o similar) en schema.ts, no forzar el dato en
anfitriones_multi. Es una decisión de qué entra al vector de campaña, no
un bug de retrieval — queda para cuando se revise el vector de
segmentación completo, no se resuelve hoy.
El patrón que confirma esta sesión
Cada hueco resultó ser una de dos cosas, nunca lo que parecía a primera vista:
- Ya estaba resuelto (precio) — el pendiente estaba desactualizado.
- Tiene vía real pero manual (SESNSP: 1 clic; el Monitoreo mismo es
así) — no automatizable sin credenciales, y eso está bien: es la razón
documentada en
README.mdpara que estas tres fuentes sean modo archivo. - Es un hueco estructural de la fuente, no de configuración (Bacalar, Airbnb-9-destinos) — no hay retrieval que lo cierre; el camino es un proxy declarado o excluir con nota, nunca más “buscar mejor”.
Antes de tocar cualquier hueco nuevo: verificar en vivo si la fuente realmente lo tiene (como aquí con el xlsx de Riviera Maya y el índice de Inside Airbnb) antes de escribir el conector.