Este proyecto automatiza la recolección de datos de hoteles desde la web haciendo scraping con Selenium, enriquece esos datos usando la API de Google Places, y finalmente sincroniza la información resultante con una hoja de Google Sheets mediante la API de Sheety.
- Características
- Estructura del proyecto
- Arquitectura / Flujo del Proyecto
- Requisitos
- Instalación y Configuración
- Uso
- Detalles técnicos
- Autor
- Licencia
Automatización completa del proceso de scraping
- Navegación automatizada con Selenium.
- Interacción con elementos dinámicos (botones, menús, hover, scroll, etc.).
- Manejo de tiempos de carga dinámicos con WebDriverWait.
Extracción estructurada de datos
- Obtención de información de cada hotel: dirección, teléfono, email, sitio web, etc.
- Limpieza y normalización de datos antes de almacenarlos.
- Manejo de páginas con estructuras variables.
Arquitectura modular
- Código dividido en módulos: scraper, servicios, utils, configuración, logs.
- Clases dedicadas para cada servicio (API, Sheets, JSON, etc.).
- Fácil mantenimiento y extensibilidad.
Integración con APIs externas
- Enriquecimiento de datos a través de Geocode y Google Places.
- Envío de datos a Google Sheets mediante Sheety API. Alternativa: guardado local en .json.
Pipeline de procesamiento
- Flujo completo desde la obtención de datos hasta el almacenamiento final.
- Manejo de errores y reintentos.
Configuración mediante archivos .env
- Variables sensibles aisladas: API keys, URLs, credenciales.
- Carga automática en el proyecto mediante
config.py. Aquí tambien se encuentran otras variables no sensibles.
Registro detallado de ejecución
- Logging configurado con distintos niveles (INFO, WARNING, ERROR).
- Guardado automático de logs en archivos con nombre por fecha.
Compatibilidad y requerimientos
- Probado con Selenium + ChromeDriver.
- Compatible con Python 3.10+.
- Todas las dependencias se encuentran en
requeriments.txt
Facilidad de uso
- Ejecución del scraping con un único comando (python main.py).
- Instrucciones de instalación claras.
- README completo para reproducir el proyecto.
Web Scraping Capstone/
│
├── data/
├──
├──
├── logs/
├── archivos.log
├── models/
├── hotel.py
├── scrapers/
├── abihal_scraper.py
├── base_scraper.py
├── services/
├── google_apis.py
├── google_client.py
├── sheety_api.py
├── utils /
├── driver_factory.py
├── enrich_hotels.py
├── file_manage.py
├── hotel_lloader.py
├── logger.py
├── .env
├── config.py
├── main.py
├── README.md
├── requeriments.txt
---
- Carga variables de entorno.
- Ejecuta AbihalScraper para obtener datos de hoteles.
- Guarda datos en JSON.
- Enriquecimiento con Google Places.
- Sincronización con Sheety.
- Python 3.8+
- Selenium
- Webdriver-manager
- Python-dotenv
- Googlemaps
- Requests
- Pydantic
# 1. Clonar el repositorio
git clone https://github.com/dimyakk/web-scraping-with-selenium.git
cd web-scraping-with-selenium
# 2. Crear y activar entorno virtual
python -m venv .venv
# En Linux / Mac
source .venv/bin/activate
# o en Windows:
.venv\Scripts\activate
# 3. Instalar dependencias
pip install -r requirements.txt
# 4. Configura el archivo .env y config.py
API_ENDPOINT=...
API_TOKEN=...
SHEET_NAME=...
BASE_URL=...
#Recordar poner las variables sensibles en .env# Ejecutar el script principal
python main.pyEl script realizara un pipeline completo de la siguiente manera:
- Accede a la web y extrae los datos de la clase Hotel, guardandolos en un JSON.
- Realiza una solicitud HTTP a la API Geocode (obtiene latitud y longitud de los lugares)
- Realiza otra solicitud HTTP a la API Google Places con lat y lon para enriquecer los hoteles, creando un nuevo JSON.
- Finaliza haciendo un POST a Sheety API para guardar los datos enriquecidos de cada Hotel.
- Lenguaje: Python 3.12+
- Librerías:
seleniumpython-dotenvtimerandomjsonloggingosrequestsgooglemapspydantictyping
- Principales clases y métodos:
BaseScraper→ clase base para hacer scraping en Selenium.AbihalScraper→ clase para el scrap en la web.hotel→ modelo de hotel.google_clientygoogle_apis→ ambas sirven para hacer la solicitud a las API's de Google.sheety_api→ llamada a la Sheety API.create_driver→ función que crea el driver.enrich_hotels→ script para crear un nuevo JSON con datos enriquecidos.save_json→ función para guardar el JSON.get_logger→ función para acceder al logger.
Joaquín Albano
Estudiante de programación y entusiasta de la automatización con Python.
📧 Contacto: [jalbano1998@gmail.com]
MIT License
Este proyecto puede ser usado, modificado y distribuido libremente con atribución al autor original.