Skip to content

Commit

Permalink
Refactor: Actualizada configuración de .gitignore, automatización en …
Browse files Browse the repository at this point in the history
…GitHub Actions y estructura del proyecto
  • Loading branch information
rociobenitez committed Jan 6, 2025
1 parent a9836ad commit 72f9039
Show file tree
Hide file tree
Showing 6 changed files with 84 additions and 51 deletions.
6 changes: 5 additions & 1 deletion .github/workflows/fotocasa-scraper.yml
Original file line number Diff line number Diff line change
Expand Up @@ -47,6 +47,10 @@ jobs:
run: |
sudo ln -s /snap/bin/chromium /usr/bin/google-chrome || echo "Symlink already exists"
sudo ln -s /usr/bin/chromedriver /usr/local/bin/chromedriver || echo "Symlink already exists"
- name: Verify Chromium works
run: |
chromium --headless --disable-gpu --dump-dom https://www.example.com || echo "Chromium failed to run"
- name: Run Python script
run: python main.py
13 changes: 7 additions & 6 deletions .gitignore
Original file line number Diff line number Diff line change
@@ -1,3 +1,10 @@
# Ignorar el CSV generado por el script
data/pisos_fotocasa.csv

# Ignorar carpetas y archivos temporales o innecesarios
data/*.csv
!data/fotocasa_sample.csv # Permitir subir el CSV de ejemplo

# Archivos y carpetas relacionadas con Python
__pycache__/
*.pyc
Expand All @@ -17,9 +24,3 @@ Thumbs.db

# Archivos de depuración o desarrollo
*.log

# Ignorar todos los CSV
*.csv

# Excluir la regla para la carpeta sample_data
!sample_data/*.csv
104 changes: 68 additions & 36 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -10,36 +10,54 @@ El código actualmente opera en un archivo HTML descargado para pruebas de scrap

- **Automatización de la navegación**: Interacción con la página mediante Selenium para manejar contenido dinámico y simulación de scroll.
- **Extracción de datos**: Análisis del DOM con BeautifulSoup para capturar:
- Título del anuncio
- Precio
- Ubicación
- Superficie
- Habitaciones y baños
- Enlace al anuncio
- Título del anuncio
- Precio
- Ubicación
- Superficie
- Habitaciones y baños
- Enlace al anuncio
- **Salida estructurada**: Los datos extraídos se guardan en un archivo CSV.

## Limitaciones y Consideraciones

- **Bloqueos del sitio:**
- Fotocasa puede bloquear el acceso si detecta un uso automatizado (como scrapers).
- Posibles soluciones:
- Usar un **User-Agent** realista para simular un navegador.
- Implementar pausas aleatorias y un scroll más natural para evitar patrones repetitivos.
- Alternar direcciones IP utilizando una VPN o un servicio de proxies.
- Fotocasa puede bloquear el acceso si detecta un uso automatizado (como scrapers).
- Posibles soluciones:
- Usar un **User-Agent** realista para simular un navegador.
- Implementar pausas aleatorias y un scroll más natural para evitar patrones repetitivos.
- Alternar direcciones IP utilizando una VPN o un servicio de proxies.
- **Tiempos de carga:**
- Dependiendo de la conexión a internet, la página puede tardar en cargar todos los anuncios al hacer scroll.
- El script incluye pausas dinámicas para asegurar que los elementos del DOM estén completamente cargados antes de analizarlos.
- Dependiendo de la conexión a internet, la página puede tardar en cargar todos los anuncios al hacer scroll.
- El script incluye pausas dinámicas para asegurar que los elementos del DOM estén completamente cargados antes de analizarlos.
- **Actualizaciones dinámicas:**
- El script funciona correctamente en la estructura actual de Fotocasa. Si cambian las clases o elementos HTML, será necesario actualizar el código.
- El script funciona correctamente en la estructura actual de Fotocasa. Si cambian las clases o elementos HTML, será necesario actualizar el código.
- **Compatibilidad con versiones de Chrome y ChromeDriver:**
- Es fundamental que las versiones de Google Chrome y ChromeDriver sean compatibles. Recomendamos verificar las versiones instaladas ejecutando:
```bash
google-chrome --version
chromedriver --version
```
- Si las versiones no coinciden, descarga la versión adecuada de ChromeDriver desde [aquí](https://googlechromelabs.github.io/chrome-for-testing/).
- Para sistemas macOS, asegúrate de otorgar permisos a `chromedriver` en "Seguridad y Privacidad" si aparece un error de verificación de software malicioso.
- **Configuraciones adicionales:**
- Si ejecutas el script en GitHub Actions, asegúrate de tener configurada la ruta de `chromedriver` y `google-chrome` correctamente.
- Hemos añadido configuraciones específicas para evitar bloqueos del sitio, como pausas aleatorias y scrolls naturales.
- **Uso responsable:**
- Este script es para fines educativos y personales. Asegúrate de cumplir con los términos de uso de Fotocasa.
- Este script es para fines educativos y personales. Asegúrate de cumplir con los términos de uso de Fotocasa.

## Requisitos

- **Python** 3.9 o superior
- **Google Chrome** y **Chromedriver**: Para Selenium
- **Python** 3.10 o superior
- **Google Chrome:** Asegúrate de tener instalado Google Chrome.
- **ChromeDriver:** Debes descargar e instalar la versión correcta de ChromeDriver que coincida con tu versión de Chrome. Para sistemas Unix/macOS, recomendamos mover el binario de `chromedriver` a `/usr/local/bin`:
```bash
sudo mv chromedriver /usr/local/bin/chromedriver
```
- Verifica que ChromeDriver esté instalado correctamente:
```bash
chromedriver --version
```
- **Librerías necesarias**:

```bash
pip install -r requirements.txt
```
Expand All @@ -48,55 +66,69 @@ El código actualmente opera en un archivo HTML descargado para pruebas de scrap

```plaintext
fotocasa-scraper/
├── main.py # Script principal (Selenium y BeautifulSoup)
├── requirements.txt # Dependencias del proyecto
├── sample_data # Ubicación del CSV de ejemplo
├── pisos_fotocasa.csv # Salida en formato CSV
└── README.md # Documentación del proyecto
├── .github/
│ └── workflows/
│ └── main.yml # Configuración para GitHub Actions
├── main.py # Script principal (Selenium y BeautifulSoup)
├── requirements.txt # Dependencias del proyecto
├── data
| ├── fotocasa_sample.csv # CSV de ejemplo
| └── pisos_fotocasa.csv # CSV original
└── README.md # Documentación del proyecto
```

## Ejecución del Script
## Ejecución del script en local

1. **Activa el entorno virtual:**

```bash
source .venv/bin/activate
```

1. **Configuración de dependencias:**
2. **Configuración de dependencias:**

```bash
pip install -r requirements.txt
```

2. **Ejecuta el script:**
3. **Verifica que chromedriver está configurado:**

```bash
chromedriver --version
```

4. **Ejecuta el script:**

```bash
python main.py
```

El script:

- Acepta cookies automáticamente.
- Realiza un scroll simulado para cargar todos los anuncios.
- Navega por las páginas hasta que no haya más resultados.
- Guarda los datos extraídos en un archivo CSV (`pisos_fotocasa.csv`).

Aquí está la versión modificada para incluir la opción de usar PythonAnywhere:

---

## Datos de Ejemplo

En la carpeta `sample_data` encontrarás un archivo CSV de ejemplo (`fotocasa_sample.csv`) con tres viviendas extraídas de la página de Fotocasa. Este archivo está incluido para mostrar el formato de los datos generados por el script.
En la carpeta `data` encontrarás un archivo CSV de ejemplo (`fotocasa_sample.csv`) con tres viviendas extraídas de la página de Fotocasa. Este archivo está incluido para mostrar el formato de los datos generados por el script.

### Notas:
- El archivo `fotocasa_sample.csv` no se actualiza automáticamente.
- Los datos del archivo son ficticios y solo se incluyen como referencia del resultado esperado al ejecutar el script.

---
- El archivo `fotocasa_sample.csv` de la carpeta `data` no se actualiza automáticamente.
- Los datos del archivo son ficticios y solo se incluyen como referencia del resultado esperado al ejecutar el script.

## Automatización en PythonAnywhere

#### **Configuración inicial:**

1. **Regístrate y configura tu cuenta:**

- Crea una cuenta en [PythonAnywhere](https://www.pythonanywhere.com).

2. **Sube el proyecto:**

- Ve a la sección **Files** y sube tus archivos (`main.py`, `requirements.txt`, etc.).

3. **Instala las dependencias:**
Expand All @@ -115,16 +147,16 @@ En la carpeta `sample_data` encontrarás un archivo CSV de ejemplo (`fotocasa_sa
```

#### **Ventajas de PythonAnywhere:**

- El script se ejecuta incluso si tu ordenador está apagado.
- Evitas bloqueos por IP al usar la IP del servidor de PythonAnywhere.
- Puedes acceder y supervisar el proyecto desde cualquier lugar.

---

## **Enlaces de Referencia**

- 🔗 [Documentación de Selenium](https://www.selenium.dev/documentation/)
- 🔗 [Documentación de BeautifulSoup](https://www.crummy.com/software/BeautifulSoup/bs4/doc/)
- 🔗 [Descargar ChromeDriver](https://developer.chrome.com/docs/chromedriver/downloads?hl=es-419)

## Nota Importante

Expand Down
6 changes: 3 additions & 3 deletions main.py
Original file line number Diff line number Diff line change
Expand Up @@ -7,11 +7,11 @@
from bs4 import BeautifulSoup

# Configurar el servicio de Chromedriver
chrome_service = Service(executable_path="/usr/bin/chromedriver")
chrome_service = Service()

# Configurar opciones de Chrome
chrome_options = webdriver.ChromeOptions()
chrome_options.binary_location = "/snap/bin/chromium"
chrome_options.add_experimental_option("detach", True)
chrome_options.add_argument("--headless") # Ejecutar en modo sin interfaz
chrome_options.add_argument("--no-sandbox") # Solución para problemas de entorno
chrome_options.add_argument("--disable-dev-shm-usage") # Solución para problemas de memoria compartida
Expand Down Expand Up @@ -146,5 +146,5 @@ def scroll_pagina(driver):
df = pd.DataFrame(datos_pisos)

# Guardar los datos en un archivo CSV
df.to_csv('pisos_fotocasa.csv', index=False, encoding='utf-8-sig')
df.to_csv('data/pisos_fotocasa.csv', index=False, encoding='utf-8-sig')
print("Datos guardados en 'pisos_fotocasa.csv'")
2 changes: 1 addition & 1 deletion requirements.txt
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
beautifulsoup4==4.12.3
pandas==2.1.1
selenium==4.26.1
selenium==4.10.0
numpy==1.25.0
4 changes: 0 additions & 4 deletions sample_data/pisos_fotocasa.csv

This file was deleted.

0 comments on commit 72f9039

Please sign in to comment.