Loading repository data…
Loading repository data…
Fernandodg97 / repository
Esta práctica consiste en una página web dinámica en PHP la cual extrae los datos de www.rspb.org.uk utilizando scraping con Selenium.
Proyecto fullstack desarrollado como práctica de Grado Superior en DAW y posteriormente mejorado y desplegado en producción de forma autónoma.
Stack: PHP 8.2 · MySQL · Apache · Docker · Twig · Bootstrap · Chart.js · JWT · Railway
Destacado:
📖 Este README documenta en detalle el stack técnico, las decisiones de arquitectura, las pruebas realizadas y el proceso completo de despliegue. Si quieres ver cómo resuelvo problemas reales, te recomiendo leerlo completo.
| Ruta | Descripción | Credenciales |
|---|---|---|
/ | Página principal | — |
/login | Inicio de sesión | Usuario: user · Contraseña: user |
/register | Registro de nuevos usuarios | — |
/admin | Panel de administración | Requiere login |
Este proyecto fue retomado después de obtener la nota final con el objetivo de llevarlo a producción y resolver problemas técnicos pendientes. A continuación se detallan las mejoras realizadas y lo aprendido en el proceso.
El proyecto fue desplegado en Railway, una plataforma gratuita que soporta Docker y MySQL. Este proceso implicó:
Dockerfile existente para que Railway lo detectara correctamente.mpm_event vs mpm_prefork) que impedía arrancar el contenedor.$PORT.docker-entrypoint.sh) para aplicar la configuración en runtime.URL de producción: https://vueloamenazadolocal-production.up.railway.app
Al desplegar, se detectaron errores que no eran visibles en local:
http://www.vueloamenazado.local como base para las llamadas a la API. En producción esto causaba timeouts de 15 segundos y errores 502. Se corrigieron para usar http://localhost:$PORT dinámicamente./public/assets/) que no existía en producción. Se migró a CDN.letra y el tipo de gráfico seleccionado se perdían. Se corrigió conservándolos en la redirección.Se resolvió el problema pendiente de proteger los endpoints de escritura de la API REST:
El cambio de idioma se gestionaba mediante ?lang= en la URL, lo que exponía el parámetro permanentemente. Se mejoró para:
Esta práctica consiste en una página web dinámica en PHP la cual extrae los datos de www.rspb.org.uk utilizando scraping con Selenium. Link al proyecto: wselenium.
Dispone de un frontal que nos permite visualizar todos los pájaros, una segunda página que nos permite visualizar la información de estos. También dispone de una página para iniciar sesión y un panel de administración.
Entre sus funcionalidades destacan:
La interfaz de usuario se implementó utilizando Bootstrap para garantizar un diseño responsivo y moderno. La página principal muestra los datos obtenidos mediante scraping, permitiendo a los usuarios interactuar con ellos a través de funcionalidades como búsquedas y filtros. Además, se utilizó Twig como sistema de plantillas para representar los datos, lo que facilita la gestión y presentación dinámica de la información en la web.
Se ha utilizado la librería Chart.js para representar gráficamente los datos extraídos. Esta librería permite crear gráficos interactivos y visualmente atractivos, como gráficos de barras o circulares, para mostrar la información de manera clara y comprensible.
Se implementó un sistema de routing en PHP que permite gestionar las diferentes rutas de la aplicación, como la página principal, la página de administración y las rutas de autenticación. Cada ruta está claramente definida en archivos separados, lo que facilita la organización y mantenimiento del código.
Se ha creado un panel de administración accesible exclusivamente para usuarios autenticados. Desde este panel, los usuarios pueden gestionar los datos obtenidos mediante el scraping. Los datos extraídos se almacenan en una base de datos, y a través del panel de administración, los usuarios pueden editar, actualizar o eliminar la información de las especies y sus detalles.
Se implementó un sistema de autenticación mediante JWT para gestionar el acceso de los usuarios. Este sistema permite el inicio de sesión y mantiene la sesión activa incluso si el usuario cierra el navegador, utilizando cookies y sesiones. Las rutas y funcionalidades del panel de administración están protegidas para garantizar que solo los usuarios autenticados puedan acceder y realizar acciones, como la gestión de los datos obtenidos por scraping. Esto asegura un control adecuado sobre el acceso a la aplicación.
La información obtenida se almacena en una base de datos, y se ha creado un sistema que permite gestionar esos datos mediante una API REST. Esta API se encarga de manejar las solicitudes para acceder, agregar, actualizar o eliminar la información almacenada, asegurando que el flujo de datos sea organizado y eficiente.
Se implementó la internacionalización en la aplicación utilizando la biblioteca gettext en PHP. Esto permite que la aplicación soporte al menos dos idiomas, español e inglés. Se ha asegurado que todas las interfaces de usuario y mensajes estén correctamente traducidos, garantizando que los usuarios puedan interactuar con la aplicación en el idioma de su preferencia.
Se realizó un scraping de datos utilizando Selenium en Python para extraer información de una página web pública. Los datos obtenidos se estructuraron y almacenaron en una base de datos.
Se creó un modelo de datos estructurado para almacenar la información obtenida mediante scraping en la base de datos. El modelo incluye las siguientes tablas: Pájaro, Datos, Lugares, Avistamientos y Usuarios. La relación entre las tablas es la siguiente: Pájaro y Datos tienen una relación uno a uno; Lugares y Pájaros están relacionados a través de una relación muchos a muchos (mediante la tabla de Avistamientos). Este modelo está diseñado para ser flexible y permitir futuras ampliaciones sin grandes modificaciones.