Este proyecto nace de un problema que tuve tanto durante mi etapa universitaria como ahora, ya en el mundo laboral. El problema surge cada vez que intento reservar un viaje con Renfe en horas punta.
Estas franjas suelen ser los viernes y domingos por la tarde, cuando los estudiantes van y vuelven a sus casas. También entre semana a primera hora, cuando la gente va a trabajar.
Conseguir un billete en esos momentos es complicado: o reservas con mucha antelación, o confías en tener suerte y que justo alguien cancele su viaje en el instante en que intentas comprar.
De ahí surge la idea de este proyecto. El bot te permite seleccionar los viajes que estén completos y los monitoriza por ti. En cuanto detecta que alguien ha cancelado su billete, te envía una notificación para que puedas comprarlo al momento.
Funcionamiento
La interacción con el bot se realiza a través de Telegram.
Desde ahí, puedes indicar las estaciones de origen y destino junto con la fecha de viaje. Se te muestran y eliges el tren que quieres monitorear. Solo puedes monitorear trenes que esten llenos.
Puedes añadir múltiples viajes, consultar la lista de trayectos en seguimiento o eliminar viajes (si un trayecto deja de estar lleno, se elimina automaticamente de la lista de monitoreo).
En el momento que alguien cancele su viaje, el bot te envía una notificación.
Detalles Técnicos
El núcleo del proyecto es un scraper desarrollado en Python utilizando Playwright. Playwright permite interactuar con la páginas web como lo haría una persona.
El proceso de scraping sigue estos pasos:
- Navegación y Cookies: El bot inicia una instancia de Chromium (headless), accede a la web de Renfe y gestiona el banner de cookies.
- Interacción con el Formulario:
- Autocompletado: Para introducir las estaciones de origen y destino, el script escribe el nombre, espera las sugerencias del autocompletado y utiliza
difflib.SequenceMatcherpara seleccionar la opción más similar. - Selección de Fecha: Interactúa con el componente de calendario
lightpickde la web, navegando entre meses y años para hacer clic en el día exacto.
- Autocompletado: Para introducir las estaciones de origen y destino, el script escribe el nombre, espera las sugerencias del autocompletado y utiliza
- Extracción de Resultados: Una vez realizada la búsqueda, el script espera a que cargue la tabla de trenes (
#listaTrenesTBodyIda). Analiza cada fila para extraer horarios y determinar el estado:- Disponible: Si detecta un precio (
.precio-final). - Completo: Si encuentra indicadores de plazas agotadas (iconos específicos o clases CSS).
- Disponible: Si detecta un precio (
- Verificación: Compara los resultados con los trenes monitorizados y, si encuentra disponibilidad en uno que estaba lleno, lanza la notificación a través de la API de Telegram.