Alquilar una casa con un LLM local como filtro
Buscar una casa para alquilar es un trabajo a tiempo parcial: refrescar los sitios de anuncios, hojear los mismos anuncios sin salida, perderse el bueno porque apareció a las 2 a.m. Así que construí un observador que hace el cribado por mí. Está en home.khanoff.com.
Dos fuentes, un pipeline
Extrae listados frescos cerca de Kyiv de dos fuentes y los normaliza en un único flujo:
- OLX.ua — la página de resultados de búsqueda se analiza con BeautifulSoup, y se obtiene la descripción completa por cada nuevo anuncio. Los filtros duros (precio, área mínima, radio) están integrados en la URL de búsqueda, por lo que el sitio realiza ese filtrado por mí.
- otodim.com.ua — en lugar de luchar contra selectores CSS frágiles, el conector lee los listados directamente del blob JSON
__NEXT_DATA__de Next.js que envía la página. Esto proporciona datos limpios y estructurados, incluido el asentamiento y distrito exactos según la propia geocodificación inversa del sitio, sin adivinar nada mediante scraping.
Ambos alimentan al mismo pipeline de desduplicación + puntuación + informe; cada anuncio recuerda su fuente.
El LLM hace el filtrado fuzzy (difuso)
Los filtros duros son fáciles: una URL de búsqueda maneja el precio y el área. La parte difícil son los criterios suaves que no puedes poner en una cadena de consulta: ¿es realmente tranquilo? ¿calefacción todo el año? ¿una casa independiente con terreno? ¿hay alguna señal de alarma en la descripción? Estos se puntúan mediante un modelo Ollama local que lee el texto del anuncio, devolviendo un veredicto estructurado por criterio. Un filtro geográfico estricto (ajustado a nombres de aldeas ucranianas) elimina los listados "técnicamente cercanos pero en la dirección equivocada".
Cuando algo supera el umbral, recibo un mensaje de Telegram con la puntuación y un enlace, generalmente mucho antes de que yo hubiera refrescado la página por mí mismo.
El informe es una PWA
Más allá de las alertas, hay un informe HTML instalable y compatible con dispositivos móviles con cada listado puntuado, insignias de fuente y un rango de precios que puedo editar desde la propia página (almacenado en un pequeño archivo JSON, sin reconstruir). Es una Aplicación Web Progresiva (Progressive Web App), por lo que se sitúa en la pantalla de inicio de mi teléfono como una aplicación nativa.
El tema recurrente: mantener el modelo fuera de la ruta crítica
Al igual que el resto de mi infraestructura, el LLM aquí es un mejoramiento, no una dependencia. La ingesta, desduplicación y el informe siempre funcionan; si el modelo no está disponible, un listado simplemente no se puntúa todavía, no se pierde. El scraper sigue ejecutándose, y la puntuación se pone al día cuando el modelo vuelve.
Es una herramienta pequeña, pero convirtió un ritual diario ansioso en un ping de Telegram cuando aparece algo realmente digno de mirar.
Transparencia: la mayoría de las entradas se redactan con ayuda de IA, y las versiones que no están en inglés se traducen automáticamente con un LLM local y luego se revisan. ¿Has visto un error? Avísame, por favor.