Este proyecto tiene un propósito totalmente educacional y de aprendizaje, sin ningún fin lucrativo. Su objetivo principal es desarrollar habilidades en web scraping, procesamiento de datos, organización de proyectos y gestión de datos estructurados utilizando Python.
El objetivo es realizar un scraping exhaustivo de la página Transfermarkt, extrayendo datos estructurados de regiones, ligas, equipos y jugadores. El foco está en la arquitectura modular, la reutilización de código y la robustez ante cambios en la estructura HTML.
- Scraping: En desarrollo activo. Toda la lógica se encuentra en la carpeta
scraping. - Base de datos: En stand-by. Los datos extraídos se almacenan temporalmente en la carpeta
Data Outputen formato JSON. - Interactividad: En desarrollo futuro. Se planea añadir un módulo interactivo para explorar los datos extraídos.
- Inicialización:
- Se configuran los componentes principales: cliente HTTP (
HTTPClient), motor de scraping (ScrapingEngine), gestores de URL, regiones, ligas, equipos y jugadores.
- Se configuran los componentes principales: cliente HTTP (
- Extracción de datos:
- Se recorren las regiones configuradas, extrayendo sus ligas, equipos y jugadores asociados.
- El flujo es jerárquico: Región → Ligas → Equipos → Jugadores.
- Procesamiento y cálculo de estadísticas:
- Se calculan estadísticas agregadas a nivel de región, liga y equipo.
- Almacenamiento temporal:
- Los datos se guardan en la carpeta
Data Outputen formato JSON, listos para análisis o integración futura con una base de datos.
- Los datos se guardan en la carpeta
- (Próximamente) Interactividad:
- Se prevé un módulo para explorar y consultar los datos extraídos de forma interactiva.
├── config/
│ ├── __init__.py
│ ├── config.py # Configuración y validación de entorno para conexión a PostgreSQL
│ ├── exceptions.py # Excepciones personalizadas para configuración
│ ├── headers.py # Headers HTTP para scraping
│ └── run_scraper.py # (Opcional) Script para lanzar el scraper desde config
├── database/
│ ├── __init__.py
│ ├── db_connection.py # Lógica de conexión a la base de datos
│ ├── db_engine.py # Funciones y clases para gestión de la base de datos
│ └── db_creator.py # Creación y validación de la base de datos
├── interactive/
│ ├── __init__.py
│ ├── menu.py # Menús interactivos para CLI
│ └── menu_engine.py # Utilidades y validaciones de menús
├── scraping/
│ ├── ws_engine.py # Motor base para scraping y utilidades HTML
│ ├── ws_leagues.py # Gestión y extracción de ligas
│ ├── ws_teams.py # Gestión y extracción de equipos
│ ├── ws_players.py # Gestión y extracción de jugadores
│ ├── ws_dataManager.py # Gestión y serialización de datos extraídos
│ ├── ws_entities.py # Definición de entidades y modelos de datos
│ ├── ws_urls.py # Gestión dinámica de URLs y paginación
│ ├── ws_region.py # Gestión y procesamiento de regiones
│ └── ws_httpClient.py # Cliente HTTP robusto con reintentos y validación
├── Data Output/
│ └── all_regions_with_leagues_and_teams.json
├── main.py # Script principal para ejecutar el scraping
├── transfermarkt_project.ipynb # Notebook de ejemplo y pruebas
├── requirements.txt # Dependencias del proyecto
├── README.md # Documentación del proyecto
├── .env # Variables de entorno (no versionado)
├── .gitignore
└── LICENSE- config.py: Clase
EnvironmentConfigpara recolectar y validar datos de conexión a PostgreSQL.- Métodos:
_input_field,_show_fields,_collect_config,_validate_database,__str__
- Métodos:
- exceptions.py: Excepciones personalizadas para errores de configuración.
- headers.py: Headers HTTP para requests.
- run_scraper.py: (Si existe) Script para lanzar el scraper desde la configuración.
- db_connection.py: Funciones para conectar a la base de datos.
- db_engine.py: Clase
DBManagerpara operaciones sobre la base de datos (validación, inserción, etc.). - db_creator.py: Clase
DatabaseCreatorpara crear y validar la existencia de la base de datos.
- menu.py: Menús interactivos para la CLI.
- menu_engine.py: Clases
MenuUtilsyMenuValidationpara utilidades y validaciones de menús.
- ws_engine.py: Clase
ScrapingEnginecon utilidades para scraping:- Métodos:
expand_collpased_cells,get_total_pages,get_table_headers,measure_row_lengths,get_country_info,get_league_tier,get_seasons,calculate_avg_value, y otros auxiliares.
- Métodos:
- ws_entities.py: Modelos de datos con
@dataclass:- Clases:
Player,Team,League,Region,Country,TransferMarket,Stats - Métodos:
to_dict, agregación de entidades hijas, validación de integridad.
- Clases:
- ws_dataManager.py: Clase
DataManagerpara centralizar y serializar datos:- Métodos:
add_region,to_dict,to_json
- Métodos:
- ws_urls.py: Gestión dinámica de URLs y paginación:
- Clases:
URLManager,TransfermarktURLManager - Métodos:
initialize_urls,build_url,fetch_html,extract_total_pages,generate_urls
- Clases:
- ws_region.py: Clase
RegionManagerpara orquestar el scraping de una región:- Métodos:
create_region,process_region
- Métodos:
- ws_leagues.py: Clase
LeagueManagerpara gestionar ligas:- Métodos:
get_league_data,process_league_season,extract_cell_value
- Métodos:
- ws_teams.py: Clase
TeamManagerpara equipos:- Métodos:
get_team_data,process_team_players,extract_cell_value
- Métodos:
- ws_players.py: Clase
PlayerManagerpara jugadores:- Métodos:
get_player_data,extract_cell_value
- Métodos:
- ws_httpClient.py: Cliente HTTP robusto:
- Métodos:
make_request,get_html,get_json
- Métodos:
- main.py inicializa los componentes principales.
- Se recorren las regiones configuradas en
ws_urls.py. - Por cada región:
- Se crea la entidad
Regiony se procesan sus páginas. - Se extraen países, ligas y equipos.
- Por cada liga, se procesan sus temporadas y equipos.
- Por cada equipo, se extraen y agregan jugadores.
- Se crea la entidad
- Se calculan estadísticas agregadas.
- Se exportan los datos a JSON.
- (Futuro) Los datos pueden ser migrados a una base de datos y explorados de forma interactiva.
pip install -r requirements.txtpython main.pyLos datos extraídos se almacenan en la carpeta Data Output en formato JSON:
Data Output/
├── all_regions_with_leagues_and_teams.json- Este proyecto es educacional y está diseñado para aprender y practicar scraping y procesamiento de datos.
- El scraping depende de la estructura HTML de Transfermarkt; cambios en la web pueden requerir ajustes en el código.
- Los datos se almacenan temporalmente en JSON; la integración con base de datos y exploración interactiva están planificadas.
- Se recomienda revisar y respetar los términos de uso de Transfermarkt.
Este proyecto está licenciado bajo la GNU General Public License v3.0.