JDSA

Activo · 2024 – presente

Holiday Integrator

App WPF para agencias que comparan alojamiento en portales B2B en paralelo — Playwright, extracción XHR/JSON, agregación Union-Find y modos Masiva, Individual y MosaicVisible. Proyecto freelance independiente en Holiday Experiences.

Holiday Experiences S.A.S.

C#WPFPlaywright.NETAutomatizaciónPython

Resumen ejecutivo

Holiday Integrator (HolidayScraperApp) resuelve un cuello de botella operativo en agencias de viajes: consultar el mismo alojamiento en varios portales mayoristas B2B (BedsOnline, HotelDo, TravelC, PriceAgencies, etc.), cada uno con UI, sesión y nomenclatura propias. La comparación manual es lenta y propensa a error.

La solución automatiza búsquedas con Playwright (Chromium), extrae ofertas estructuradas (OfertaExtraida), correlaciona ofertas del mismo hotel (HotelAgregado) y las presenta en una UI WPF (mosaico, lista, mapa WebView2). Como freelance en Holiday Experiences S.A.S., diseño e implemento el motor de Estancias de este producto — un proyecto independiente de otros trabajos para el mismo cliente (cumplimiento IFX/Zadarma, sync transfronteriza de contratos, etc.).

Contexto y alcance

En alcanceFuera de alcance / parcial
Servicio Estancias (alojamiento) multi-portalOtros servicios del catálogo (Parques, Vuelos, …) sin IScraperStrategy
Búsqueda masiva comparativaReserva automática end-to-end
Consulta individual + handoff a portalSincronización de inventario en tiempo real
Comprobación visible desde mosaico (MosaicVisible)Portal genérico plug-and-play sin código por sitio
Auto-actualización vía latest.json

Arquitectura

Contenedores

Cargando diagrama…

Secuencia — búsqueda masiva

Cargando diagrama…

Capacidades clave

Gestión de portales y sesión

IDCapacidadEstado
RF-01Credenciales por portal cifradas (DPAPI)
RF-02Login interactivo cuando el portal lo exige
RF-03Persistir storage_state por siteKey
RF-10Búsqueda masiva multi-portal en paralelo
RF-13Extracción priorizando XHR/JSON sobre DOM
RF-17Handoff de reserva: browser abierto en ficha

Modos de consulta (Estancias)

ModoExtracciónBrowserHandoff
MasivaCompleta + agregaciónHeadless (defecto)No
Individual1 página, sin filtros lateralesVisible
MosaicVisibleOmitida; filtros o goto URLVisible persistenteBrowser abierto

Portales Estancias

SiteKeyEstrategiaExtracción principal
BedsOnlineBedsOnlineScraperStrategyDOM + client-hotel-avail-api
HotelDoHotelDoScraperStrategyJSONL availability + DOM
FullTrips / TravelDepotTravelCHotelesSoloAlojamientoScraperStrategyPrimeFaces partial/XHR
PriceAgenciesPriceAgenciesScraperStrategyAPI filter/v2/list
Dream_Vacation_WeakDreamVacationWeakScraperStrategyGrid certificados

Agregación multi-portal

CriterioValor / regla
AlgoritmoUnion-Find restringido (1 oferta por SiteKey por clúster)
Similitud de nombre0,88 (TokenSetRatio)
Geo cruzada0,7 km + similitud ≥ 0,45 si geo real en ambas
EstrellasDiferencia ≤ 1 estrella si ambas tienen categoría

Decisiones de diseño

PrincipioImplementación
Config-driven por portalsitios_config.json + IScraperStrategy por siteKey
Aislamiento de fallosUn portal no bloquea a otros (PlaywrightExtractionCola)
Evidencia barata primeroTrazas XHR/JSONL antes que DOM en MejoraContinua/
Seguridad localDPAPI para credenciales; sin telemetría cloud por defecto
Operación en WindowsInstalador self-contained .NET 8; WebView2 para mapa

Métricas e impacto

5+

Portales con estrategia Estancias

3

Modos de consulta

0.88

Umbral similitud nombre

Estado y roadmap

  • Activo: estrategias por portal, SmartSearch, políticas de extracción (IEstanciasExtractionPolicy)
  • Despliegue: Inno Setup + Action1 + manifiesto latest.json firmado SHA256
  • Pendiente: madurez HTTP híbrido por portal (perfil de red → HttpClient donde JSON sea estable)
  • Pendiente: portales adicionales del catálogo sin estrategia real (NoOpScraperStrategy)

Galería

Galería próximamente — capturas y demos en preparación