╔══════════════════════════════════════════════════════════════╗
║ ⚡ Visual Gallery Explorer [PRO] 📷 12 imágenes ║
╠══════════════════════════════════════════════════════════════╣
║ 🔍 Buscador │ 🖼 Galería │ ✨ Acerca de ║
╠══════════════════════════════════════════════════════════════╣
║ ║
║ ┌─────────────────────────────────────────────────────────┐ ║
║ │ 🔍 Buscar imágenes │ ║
║ │ │ ║
║ │ [Google ▼] [ Escribe qué quieres buscar... ] 🚀 │ ║
║ │ ───────────────────────────────────────────────────── │ ║
║ │ 📐 Tamaño [Cualquier ▼] 🎨 Color [Cualquier ▼] 🛡️ │ ║
║ └─────────────────────────────────────────────────────────┘ ║
║ ║
║ ┌─────────────────────────────────────────────────────────┐ ║
║ │ 📷 Resultados [24] │ ║
║ │ ┌──────┐ ┌──────┐ ┌──────┐ ┌──────┐ │ ║
║ │ │ 🖼️ │ │ 🖼️ │ │ 🖼️ │ │ 🖼️ │ │ ║
║ │ │ │ │ │ │ │ │ │ │ ║
║ │ └──────┘ └──────┘ └──────┘ └──────┘ │ ║
║ └─────────────────────────────────────────────────────────┘ ║
║ ║
║ 💡 Listo para buscar ║
╚══════════════════════════════════════════════════════════════╝
Una aplicación de escritorio moderna y elegante para buscar, explorar y descargar imágenes desde múltiples motores de búsqueda.
|
Busca imágenes simultáneamente en Google, Bing y DuckDuckGo. Cambia de motor con un solo clic. Filtra por tamaño (grande, mediano, pequeño), color (B/N, transparente, RGB) y activa SafeSearch. Selecciona múltiples imágenes y descárgalas todas a la vez con barra de progreso en tiempo real. |
Galería local con miniaturas, nombre de archivo, tamaño y acceso rápido a detalles. Presentación a pantalla completa con controles de velocidad, contador de posición y navegación por teclado. Búsqueda, descarga y carga de miniaturas en hilos secundarios. La interfaz nunca se congela. |
El código está organizado en módulos separados siguiendo el principio de responsabilidad única:
PyPhotoScraper/
├── 🚀 main.py # Punto de entrada de la aplicación
├── 📄 interfaces.py # Compatibilidad (redirige a main.py)
├── 📋 requirements.txt # Dependencias del proyecto
├── 📜 LICENSE # Licencia MIT
│
├── 🎨 ui/ # Capa de interfaz de usuario
│ ├── __init__.py
│ ├── styles.py # 🎨 Tema, colores, estilos CSS
│ └── main_window.py # 🖥️ Ventana principal y lógica UI
│
├── ⚙️ workers/ # Hilos en segundo plano
│ ├── __init__.py
│ ├── search_worker.py # 🔍 Búsqueda de imágenes (QThread)
│ └── download_worker.py # 📥 Descarga + carga de thumbnails
│
├── 🖼️ Imagenes/ # Carpeta de imágenes descargadas
└── 📦 assets/ # Recursos gráficos
┌──────────────┐ señales Qt ┌──────────────────┐
│ main.py │────────────────────▶│ MainWindow │
│ (entrada) │ │ (ui/main_window) │
└──────────────┘ └────────┬─────────┘
│
┌───────────────┼───────────────┐
▼ ▼ ▼
┌──────────────┐ ┌──────────────┐ ┌────────────┐
│ SearchWorker │ │ Downloader │ │ Thumbnail │
│ (QThread) │ │ (QThread) │ │ Loader │
└──────┬───────┘ └──────┬───────┘ └─────┬──────┘
│ │ │
▼ ▼ ▼
┌──────────────────────────────────────────────┐
│ Internet (HTTP requests) │
│ Google · Bing · DuckDuckGo │
└──────────────────────────────────────────────┘
- Python 3.8 o superior
- pip (gestor de paquetes de Python)
# 1. Clonar el repositorio
git clone https://github.com/JesusCaRu/PyPhotoScraper.git
cd PyPhotoScraper
# 2. (Opcional) Crear entorno virtual
python -m venv venv
# Windows
venv\Scripts\activate
# macOS/Linux
source venv/bin/activate
# 3. Instalar dependencias
pip install -r requirements.txtpython main.py| Paso | Acción | Descripción |
|---|---|---|
| 1 | 🔍 Buscar | Escribe un término y pulsa Enter o el botón Buscar |
| 2 | 🎨 Filtrar | Ajusta tamaño, color y SafeSearch antes de buscar |
| 3 | ☑️ Seleccionar | Haz clic en las imágenes o marca los checkboxes |
| 4 | 📥 Descargar | Pulsa Descargar para guardarlas en /Imagenes |
| 5 | 🖼 Galería | Cambia a la pestaña Galería para ver tu colección |
| 6 | 🎬 Slideshow | Inicia una presentación a pantalla completa |
| Atajo | Acción |
|---|---|
Enter |
Buscar imágenes |
Escape |
Cerrar slideshow |
Click en imagen (búsqueda) |
Seleccionar / deseleccionar |
Click en imagen (galería) |
Ver detalles |
| Paquete | Versión | Propósito |
|---|---|---|
| PyQt5 | ≥ 5.15 | Framework GUI de escritorio |
| requests | ≥ 2.25 | Peticiones HTTP |
| beautifulsoup4 | ≥ 4.9 | Parsing HTML (web scraping) |
| Pillow | ≥ 8.0 | Procesamiento de imágenes |
La interfaz utiliza un tema oscuro premium inspirado en aplicaciones modernas como Discord y Figma:
| Elemento | Color | Uso |
|---|---|---|
🟣 #6c63ff |
Violeta | Acento principal, botones primarios |
🟢 #00d4aa |
Cian | Éxito, gradientes, progreso |
🔵 #1a1f2e |
Azul oscuro | Fondo principal |
⚫ #0d1017 |
Negro profundo | Fondo del slideshow |
🟡 #ffb347 |
Ámbar | Warnings |
🔴 #ff6b6b |
Rosa | Errores, botón limpiar |
- Primary — Gradiente violeta → cian (acciones principales)
- Accent — Violeta sólido (acciones secundarias)
- Ghost — Transparente con borde (acciones opcionales)
- Danger — Borde rojo (acciones destructivas)
PyQt5 tiene su propio event loop incompatible con asyncio. Los QThread permiten ejecutar tareas pesadas (HTTP requests) sin bloquear la UI, comunicándose vía señales Qt thread-safe.
QPixmap no se puede crear fuera del hilo principal en Qt. El worker descarga las imágenes como bytes crudos y emite una señal; el slot en el hilo principal crea el QPixmap. Esto evita crashes aleatorios.
PyQt5 no soporta variables CSS nativas. Todos los colores están centralizados como constantes Python en ui/styles.py y se insertan mediante f-strings.
¡Las contribuciones son bienvenidas! Sigue estos pasos:
# 1. Fork del repositorio
# 2. Crear rama de feature
git checkout -b feature/mi-mejora
# 3. Hacer commits
git commit -m "feat: descripción de la mejora"
# 4. Push y crear Pull Request
git push origin feature/mi-mejora- 🌍 Internacionalización (i18n) — soporte multi-idioma
- 🔄 Paginación — cargar más resultados con scroll infinito
- 🏷️ Etiquetas — organizar imágenes por categorías
- 🌙 Modo claro — tema alternativo
- 📱 Layout responsive — adaptarse a ventanas más pequeñas
- 🔌 Proxy support — rotación de proxies para evitar bloqueos
Este proyecto está bajo la Licencia MIT — libre para uso personal y comercial.
Ver el archivo LICENSE para más detalles.