Share
## https://sploitus.com/exploit?id=0393280B-B063-555C-A9C1-6B4EC1CF3D64
# CyberSec Crawler

Crawler de ciberseguridad multilingüe que recolecta automáticamente noticias, vulnerabilidades, exploits y recursos educativos de las principales fuentes de seguridad informática en inglés y español.

Incluye un **menú interactivo** para facilitar todas las operaciones sin necesidad de recordar comandos.

---

## Tabla de Contenidos

- [Características](#caracteristicas)
- [Fuentes Soportadas](#fuentes-soportadas)
- [Stack Tecnológico](#stack-tecnologico)
- [Estructura del Proyecto](#estructura-del-proyecto)
- [Instalación](#instalacion)
- [Configuración](#configuracion)
- [Uso](#uso)
  - [Menú Interactivo (Recomendado)](#menu-interactivo-recomendado)
  - [Comandos Directos](#comandos-directos)
- [Arquitectura y Flujo de Datos](#arquitectura-y-flujo-de-datos)
- [Modelo de Datos](#modelo-de-datos)
- [Tests](#tests)
- [Docker](#docker)
- [Consideraciones Técnicas](#consideraciones-tecnicas)
- [Contribuir](#contribuir)
- [Licencia](#licencia)

---

## Características

- 🎮 **Menú interactivo**: Interfaz de terminal navegable para todas las operaciones
- 🌐 **Multilingüe**: Recolecta contenido en inglés y español de fuentes especializadas
- 🕷️ **12 spiders**: Cada fuente tiene su propio spider optimizado para su estructura HTML
- 🧹 **Limpieza automática**: Elimina HTML, scripts y normaliza el texto
- 🏷️ **Clasificación inteligente**: Categoriza artículos por tipo (noticia, vulnerabilidad, herramienta, etc.)
- 🔄 **Deduplicación**: Evita artículos duplicados por hash de contenido y URL
- 💾 **Almacenamiento persistente**: Guarda en SQLite/PostgreSQL con SQLAlchemy
- 📤 **Exportación múltiple**: JSON, CSV y RSS feed
- 🐳 **Dockerizado**: Listo para ejecutar en contenedores
- 📊 **Reportes**: Genera reportes con estadísticas por fuente y categoría
- ⏰ **Ejecución programada**: Script para ejecución diaria automática

---

## Fuentes Soportadas

### Fuentes en Inglés (10)

| Fuente | Spider | Tipo de Contenido |
|--------|--------|-------------------|
| The Hacker News | hackernews | Noticias de seguridad |
| Bleeping Computer | bleepingcomputer | Noticias y análisis |
| Krebs on Security | krebsonsecurity | Investigación |
| Threatpost | threatpost | Noticias de seguridad |
| Dark Reading | darkreading | Noticias y análisis |
| SANS ISC | sans_isc | Threat intelligence |
| CVE Details | cvedetails | Base de datos CVE |
| Exploit Database | exploitdb | Exploits y PoCs |
| Reddit r/netsec | reddit_netsec | Comunidad |
| GitHub Security | github_sec | Repositorios y herramientas |

### Fuentes en Español (2)

| Fuente | Spider | Tipo de Contenido |
|--------|--------|-------------------|
| ElHacker.net | elhackernet | Noticias, tutoriales y cursos |
| ElHacker.info | elhackerinfo | Cursos y recursos educativos |

---

## Stack Tecnológico

| Componente | Tecnología |
|------------|------------|
| Lenguaje | Python 3.11+ |
| Framework de Crawling | Scrapy 2.11+ |
| Base de Datos | SQLite (desarrollo) / PostgreSQL (producción) |
| ORM | SQLAlchemy 2.0+ |
| Procesamiento HTML | BeautifulSoup4 + lxml |
| Exportación | CSV, JSON, RSS (feedgen) |
| Contenedores | Docker + Docker Compose |
| Tests | unittest + mock |
| Logging | logging estándar de Python |

---

## Estructura del Proyecto

```
cybersec-crawler/
  config/                          # Configuración centralizada
    config.yaml                    # Configuración general
    sources.yaml                   # Definición de fuentes
    keywords.yaml                  # Palabras clave para clasificación
  cybersec_crawler/                # Paquete principal
    spiders/                       # Spiders individuales
      base_spider.py               # Spider base con funcionalidad común
      hackernews_spider.py         # The Hacker News
      bleeping_spider.py           # Bleeping Computer
      krebs_spider.py              # Krebs on Security
      threatpost_spider.py         # Threatpost
      darkreading_spider.py        # Dark Reading
      sans_spider.py               # SANS ISC
      cve_spider.py                # CVE Details
      exploitdb_spider.py          # Exploit Database
      reddit_spider.py             # Reddit r/netsec
      github_spider.py             # GitHub Security
      elhackernet_spider.py        # ElHacker.net
      elhackerinfo_spider.py       # ElHacker.info
    utils/                         # Utilidades
      text_cleaner.py              # Limpieza de texto HTML
      classifier.py                # Clasificador de artículos
      deduplicator.py              # Deduplicación de contenido
      url_manager.py               # Gestión de URLs
      exporter.py                  # Exportación a múltiples formatos
    items.py                       # Modelos de datos (Items)
    settings.py                    # Configuración de Scrapy
    pipelines.py                   # Pipelines de procesamiento
    middlewares.py                 # Middlewares personalizados
  scripts/                         # Scripts de automatización
    menu.py                        # Menú interactivo (NUEVO)
    run_all.py                     # Ejecuta todos los spiders
    run_daily.py                   # Ejecución diaria (fuentes principales)
    generate_report.py             # Genera reportes
    setup_db.py                    # Inicializa la base de datos
    verify_db.py                   # Verifica la base de datos
  tests/                           # Tests unitarios
    test_spiders.py                # Tests de configuración de spiders
    test_pipelines.py              # Tests de pipelines
    test_classifier.py             # Tests del clasificador
    test_deduplicator.py           # Tests del deduplicador
  data/                            # Datos persistentes
    exports/                       # Archivos exportados
  logs/                            # Logs de ejecución
  Dockerfile                       # Imagen Docker
  docker-compose.yml               # Orquestación de servicios
  requirements.txt                 # Dependencias de Python
  scrapy.cfg                       # Configuración de Scrapy
  .env.example                     # Variables de entorno (ejemplo)
  .gitignore                       # Archivos ignorados por git
  README.md                        # Este archivo
  GUIA_USO.md                      # Guía de uso detallada
  ROADMAP.md                       # Plan de desarrollo
```

---

## Instalación

### Requisitos Previos

- Python 3.11 o superior
- pip (gestor de paquetes de Python)
- Git (opcional, para clonar el repositorio)
- Docker (opcional, para ejecución en contenedores)

### Instalación Local

```bash
# 1. Clonar el repositorio
git clone https://github.com/tu-usuario/cybersec-crawler.git
cd cybersec-crawler

# 2. Crear entorno virtual
python -m venv venv

# 3. Activar entorno virtual
# En Windows:
venv\Scripts\activate
# En Linux/Mac:
source venv/bin/activate

# 4. Instalar dependencias
pip install -r requirements.txt

# 5. Instalar el paquete en modo desarrollo
pip install -e .

# 6. Configurar variables de entorno
cp .env.example .env
# Editar .env con la configuración deseada

# 7. Inicializar la base de datos
python scripts/setup_db.py
```

### Instalación con Docker

```bash
# Construir y ejecutar con Docker Compose
docker-compose up --build

# O construir la imagen manualmente
docker build -t cybersec-crawler .
docker run -v $(pwd)/data:/app/data -v $(pwd)/logs:/app/logs cybersec-crawler
```

---

## Configuración

### Variables de Entorno (.env)

```env
# Base de datos (SQLite por defecto)
DATABASE_URL=sqlite:///data/cybersec.db

# Para PostgreSQL en producción:
# DATABASE_URL=postgresql://user:password@localhost:5432/cybersec

# Nivel de logging
LOG_LEVEL=INFO

# Configuración de proxies (opcional)
# PROXY_URL=http://proxy:8080

# User-Agent personalizado
# USER_AGENT=Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36
```

### Archivos de Configuración YAML

- `config/config.yaml`: Configuración general (retry, timeouts, concurrent requests)
- `config/sources.yaml`: Definición de cada fuente (URLs, selectores CSS, tipo de contenido)
- `config/keywords.yaml`: Palabras clave para clasificación por categoría e idioma

---

## Uso

### Menú Interactivo (Recomendado)

La forma más sencilla de usar el proyecto es mediante el menú interactivo:

```bash
python scripts/menu.py
```

Desde el menú puedes acceder a todas las funcionalidades:

| Opción | Descripción |
|--------|-------------|
| **[1] 🕷️ Scraping** | Ejecutar spiders individuales o todos a la vez |
| **[2] 🔍 Búsqueda** | Buscar artículos por palabra clave, categoría, fuente, fechas, CVE o idioma |
| **[3] 📊 Estadísticas** | Ver resumen general, artículos por fuente/categoría/idioma/mes |
| **[4] 📤 Exportación** | Exportar datos a JSON, CSV o RSS |
| **[5] 🧹 Mantenimiento** | Verificar BD, ver tamaño, limpiar artículos |
| **[6] 📖 Ayuda** | Comandos rápidos y tips |
| **[0] ❌ Salir** | Cerrar el programa |

Para más detalles, consulta la [Guía de Uso](GUIA_USO.md).

### Comandos Directos

```bash
# Ejecutar todos los spiders
python scripts/run_all.py

# Ejecutar solo fuentes principales (ejecución diaria)
python scripts/run_daily.py

# Ejecutar un spider específico
scrapy crawl hackernews
scrapy crawl elhackernet
scrapy crawl cvedetails

# Generar reporte de los últimos 7 días
python scripts/generate_report.py

# Generar reporte de los últimos 30 días
python scripts/generate_report.py --days 30

# Inicializar base de datos
python scripts/setup_db.py

# Verificar base de datos
python scripts/verify_db.py
```

---

## Arquitectura y Flujo de Datos

El CyberSec Crawler sigue una arquitectura de pipelines secuenciales:

```
1. SPIDERS
   |
2. TEXT CLEANING PIPELINE
   - Limpieza de HTML
   - Normalización de texto
   - Generación de hash
   - Detección de idioma
   |
3. CLASSIFICATION PIPELINE
   - Clasificación por categoría
   - Extracción de tags
   - Asignación de nivel de dificultad
   |
4. DEDUPLICATION PIPELINE
   - Verificación por hash de contenido
   - Verificación por URL
   |
5. STORAGE PIPELINE
   - Almacenamiento en base de datos
   - Exportación a JSON/CSV/RSS
```

### Flujo Detallado

1. **Inicio**: El spider base carga la configuración de la fuente desde sources.yaml
2. **Petición HTTP**: Cada spider realiza peticiones respetando robots.txt y DOWNLOAD_DELAY
3. **Parseo**: Extrae título, contenido, fecha, autor y URL usando selectores CSS/XPath
4. **Item**: Crea un ArticleItem con los datos extraídos
5. **Pipeline 1 - TextCleaning**: Limpia HTML, normaliza texto, genera hash y detecta idioma
6. **Pipeline 2 - Classification**: Clasifica el artículo y extrae tags relevantes
7. **Pipeline 3 - Deduplication**: Verifica si el artículo ya existe (por hash o URL)
8. **Pipeline 4 - Storage**: Guarda en BD y exporta a los formatos configurados

---

## Modelo de Datos

### ArticleItem

| Campo | Tipo | Descripción |
|-------|------|-------------|
| titulo | String | Título del artículo |
| url | String | URL original |
| fuente | String | Nombre de la fuente |
| categoria | String | Categoría clasificada |
| idioma | String | es / en |
| fecha_publicacion | DateTime | Fecha de publicación original |
| fecha_recoleccion | DateTime | Fecha de recolección |
| autor | String | Autor del artículo |
| contenido_texto | String | Contenido en texto plano |
| resumen | String | Resumen de 300 caracteres |
| tags | String | Tags separados por coma |
| nivel_dificultad | String | Principiante / Intermedio / Avanzado |
| hash_contenido | String | Hash SHA256 del contenido |

### Categorías

- `noticia`: Noticias generales de seguridad
- `analisis_ataque`: Análisis de ataques y malware
- `vulnerabilidad_cve`: Vulnerabilidades con identificador CVE
- `herramienta`: Herramientas de seguridad
- `curso_gratuito`: Cursos y tutoriales
- `investigacion`: Investigaciones académicas
- `reporte`: Reportes de amenazas
- `opinion`: Artículos de opinión

---

## Tests

El proyecto incluye tests unitarios para los componentes principales:

```bash
# Ejecutar todos los tests
python -m unittest discover tests -v

# Tests de spiders (configuración básica)
python -m unittest tests.test_spiders -v

# Tests del clasificador
python -m unittest tests.test_classifier -v

# Tests de pipelines
python -m unittest tests.test_pipelines -v

# Tests del deduplicador
python -m unittest tests.test_deduplicator -v
```

---

## Docker

### Servicios Disponibles

| Servicio | Comando | Descripción |
|----------|---------|-------------|
| Crawler completo | `docker-compose up crawler` | Ejecuta todos los spiders |
| Crawler diario | `docker-compose up crawler-daily` | Solo fuentes principales |
| Generar reporte | `docker-compose up report-generator` | Reporte de últimos 7 días |
| Menú interactivo | `docker-compose run menu` | Menú interactivo en terminal |

### Construir y Ejecutar

```bash
# Construir la imagen
docker-compose build

# Ejecutar todos los servicios
docker-compose up

# Ejecutar el menú interactivo
docker-compose run menu
```

### Volúmenes

- `./data`: Base de datos SQLite y archivos exportados
- `./logs`: Logs de ejecución
- `./.env`: Configuración de entorno

---

## Consideraciones Técnicas

### Rate Limiting y Respeto a los Servidores

- DOWNLOAD_DELAY configurado en 2-5 segundos entre peticiones
- CONCURRENT_REQUESTS_PER_DOMAIN limitado a 4
- Respeto automático de robots.txt
- Pausa de 5 segundos entre spiders en ejecución completa

### Manejo de Errores

- Retry automático (3 intentos) con backoff exponencial
- Timeout configurable por petición
- Logging detallado de errores
- Los fallos de un spider no afectan a los demás

### Anti-Detección

- Rotación de User-Agents
- Headers HTTP personalizados
- Proxies configurables (opcional)
- Cookies management

### Escalabilidad

- Arquitectura modular: fácil añadir nuevas fuentes
- Base de datos intercambiable (SQLite / PostgreSQL)
- Dockerizado para escalado horizontal
- Exportación desacoplada del almacenamiento

---

## Contribuir

1. Haz fork del repositorio
2. Crea una rama para tu feature (`git checkout -b feature/nueva-fuente`)
3. Haz commit de tus cambios (`git commit -m 'Añadir nueva fuente: X'`)
4. Haz push a la rama (`git push origin feature/nueva-fuente`)
5. Abre un Pull Request

### Guía para Añadir una Nueva Fuente

1. Crear un nuevo archivo en `cybersec_crawler/spiders/`
2. Heredar de `BaseSpider`
3. Definir `name`, `allowed_domains` y `start_urls`
4. Implementar el método `parse` con los selectores CSS/XPath
5. Añadir la fuente en `config/sources.yaml`
6. Añadir palabras clave en `config/keywords.yaml`
7. Registrar el spider en `scripts/run_all.py`
8. Añadir tests en `tests/test_spiders.py`

---

## Licencia

Este proyecto está bajo la licencia MIT. Ver el archivo LICENSE para más detalles.

---

## Aviso Legal

Este crawler está diseñado exclusivamente para fines educativos y de investigación en ciberseguridad. Los usuarios son responsables de:

- Respetar los términos de servicio de cada sitio web
- Cumplir con las leyes locales de protección de datos
- No utilizar los datos recolectados para actividades ilegales
- Implementar rate limiting para no sobrecargar los servidores

---

CyberSec Crawler — Mantén tu conocimiento de ciberseguridad actualizado en inglés y español