ProxynetProxynet

Cómo descargar todas las imágenes de una web sin código

Publicado:

15 min de lectura

Enver Kaya
Autor: Enver Kaya
Marcos de fotos en puntos blancos repartidos por el lienzo; uno, de puntos azules, lleva una flecha de descarga hacia abajo.

Vas a trasladar tu antigua web a una nueva plataforma. La agencia que la creó ya no existe, no tienes acceso al servidor y las páginas de producto contienen unos cuantos cientos de fotos. Guardarlas una a una te llevaría días, y las primeras que probaste salieron más pequeñas y borrosas de lo que se ven en la página.

Esta guía trata de imágenes que tienes permiso para copiar: tu propio sitio, el kit de prensa que una organización ofrece a los periodistas o imágenes con licencia abierta cuyas condiciones respetas. Llevarte las fotos de producto de un competidor para tu propia tienda queda fuera de su alcance, y poder descargar una imagen no te da derecho a usarla (¿El web scraping es legal?). A continuación verás cuatro formas de guardar todas las imágenes de una página sin código, los motivos por los que las imágenes llegan pequeñas o faltan, qué hacer con los archivos WebP y un script opcional en Python.

¿De dónde vienen las imágenes de una página?

Cada imagen de una página es un archivo aparte. La página en sí es un archivo de texto (HTML) que indica dónde está cada imagen, y tu navegador descarga cada una con su propia petición.

Una imagen entra en la página de una de tres maneras: con una etiqueta img, que puedes guardar con clic derecho; como fondo CSS, que es la razón por la que algunos banners no ofrecen la opción de guardar; o con un elemento picture, que enumera la misma imagen en varios formatos y tamaños y deja que el navegador elija.

Muchos sitios sirven las imágenes desde una CDN (red de distribución de contenidos), un conjunto de servidores que entrega los archivos desde un punto cercano al visitante. Por eso los nombres de archivo suelen parecer aleatorios.

¿Cómo se descargan todas las imágenes de una página web?

Todos los métodos de abajo siguen los mismos cuatro pasos:

  1. Abre la página y desplázate hasta el final. Las imágenes de más abajo a menudo solo se cargan cuando llegas a ellas.
  2. Elige un método de la tabla siguiente.
  3. Limpia la carpeta. Borra logotipos, iconos e imágenes de seguimiento de un píxel.
  4. Comprueba el tamaño. Si una imagen es más pequeña de lo que parecía en pantalla, busca la dirección a tamaño completo.
MétodoQué obtienesImágenes cargadas al desplazarte¿Tamaño completo?Útil para
Chrome: Guardar página como > Página web completaUn archivo HTML y una carpeta con sus archivosLas que carga un script, solo tras desplazarteNo, la copia elegida para tu pantallaUna página, sin instalar nada
Extensión de descarga masiva de imágenesLas imágenes que marques, tras filtrarSí, si te desplazaste antesNormalmente la copia que ves en pantallaUnas pocas páginas, ordenar por tamaño
Firefox: Información de la página > MultimediaTodas las imágenes de la página, fondos incluidosSí, si te desplazaste antesLa copia que cargó la páginaFirefox, sin complementos
DevTools > Red > ImgUn archivo cada vez, con su dirección realSí, a medida que te desplazasSí, si eliges la copia más grandeUnas pocas imágenes a tamaño completo
Script de Python (avanzado)Todas las direcciones img y source del HTMLLee data-src, no ve las imágenes añadidas por JavaScriptElige la copia más grande de srcsetTareas repetidas

Cómo guardar todas las imágenes con Página web completa de Chrome

Este método no requiere instalar nada. Abre la página, desplázate hasta el final, abre el menú de tres puntos de arriba a la derecha y elige Enviar, guardar y compartir > Guardar página como (Ctrl+S, o Cmd+S en Mac), como describe la ayuda de Chrome.

Elige el formato Página web completa y haz clic en Guardar. Chrome crea un archivo .html y, a su lado, una carpeta con el mismo nombre terminada en _files. Las imágenes están en esa carpeta junto a hojas de estilo y scripts; ordénala por tipo para encontrarlas.

Chrome guarda los archivos a los que apunta la página en ese momento, así que, si nunca te desplazaste, faltarán las imágenes que un script coloca durante el desplazamiento. Además obtienes las copias que recibió tu pantalla, no siempre los originales.

¿Cómo se usa una extensión de descarga masiva de imágenes?

Busca «image downloader» en Chrome Web Store para encontrar extensiones que muestran todas las imágenes de la pestaña abierta. No nombramos ninguna, porque cambian de dueño a menudo. La mayoría funciona así:

  1. Instala la extensión, abre la página y desplázate hasta el final.
  2. Haz clic en el icono de la extensión. Aparece una cuadrícula con las imágenes de la página.
  3. Sube el filtro de anchura mínima hasta que desaparezcan los iconos y las miniaturas.
  4. Marca las imágenes que quieras y haz clic en descargar.

Para no tener que confirmar una ventana de guardado por cada imagen, ve a Configuración > Descargas y desactiva Preguntar dónde se guardará cada archivo antes de descargarlo.

Lee los permisos antes de instalar. Muchas de estas extensiones piden permiso para leer y cambiar todos tus datos en todos los sitios web, lo que les permite ver cada página que abres. Revisa las reseñas, la última actualización y el desarrollador, y elimina la extensión cuando termines.

Cómo guardar todas las imágenes con la ventana Información de la página de Firefox

Firefox trae una forma integrada. Pulsa Ctrl+I (Cmd+I en Mac) para abrir la ventana Información de la página y después abre la pestaña Multimedia.

La lista muestra todas las imágenes que usa la página, fondos e iconos incluidos, con su dirección y su tipo. Haz clic en Seleccionar todo, luego en Guardar como…, y elige una carpeta. Cuenta con tener que borrar algunos iconos después.

¿Cómo se encuentra la dirección real de una imagen con DevTools?

DevTools (herramientas para desarrolladores) es un panel integrado en Chrome que muestra todo lo que carga una página, y es la forma de encontrar el archivo a tamaño completo.

  1. Pulsa F12 y abre la pestaña Red (Network).
  2. Haz clic en el filtro Img, uno de los filtros por tipo que enumera la referencia del panel Network de Chrome.
  3. Recarga la página y desplázate hasta el final. DevTools solo registra las peticiones mientras está abierto.
  4. Cada fila muestra el nombre del archivo, su tipo (webp, avif, jpeg) y su tamaño. Haz clic en una fila para ver una vista previa.
  5. Haz clic derecho en la fila, elige Copiar > Copiar URL, abre la dirección en una pestaña nueva y guarda allí la imagen.

Para una sola imagen, haz clic derecho sobre ella y elige Inspeccionar. Si su etiqueta img tiene un atributo srcset, este enumera varias copias con una anchura detrás de cada una, como photo-400.jpg 400w, photo-1600.jpg 1600w. El número más alto corresponde a la copia más grande.

Buscar «.jpg» en el código fuente de la página (Ctrl+U) deja mucho fuera: el código fuente es el HTML que el servidor envió al principio, así que las imágenes que JavaScript añade después no están ahí.

¿Por qué las imágenes se descargan pequeñas, borrosas o no se descargan?

1. Tu navegador eligió una copia pequeña. Con srcset, un sitio enumera la misma imagen en varias anchuras. La referencia del elemento img de MDN dice que el navegador elige entre estas fuentes a su propio criterio. En una ventana estrecha suele tomar una más pequeña, y eso es lo que guardas.

2. La imagen aún no se había cargado. Una etiqueta con loading="lazy" espera a que la imagen se acerque a la pantalla. Otros sitios guardan la dirección real en un atributo data-src y muestran un marcador en blanco o borroso hasta que un script lo sustituye. Es el mismo mecanismo que rellena las páginas con JavaScript después de la primera carga (Páginas estáticas y dinámicas en web scraping).

3. La miniatura y la imagen completa son archivos distintos. En books.toscrape.com, un sitio de práctica creado para el scraping, la portada de «A Light in the Attic» mide 125 × 155 píxeles en la página de inicio y 318 × 395 píxeles en la página del propio libro.

4. La dirección pide una copia pequeña. Muchas CDN de imágenes ponen el tamaño en la dirección, como ?w=400, y redimensionan la imagen para que coincida.

Para arreglarlo, ensancha la ventana, recorre toda la página, abre la imagen grande de la galería antes de guardar o toma la copia más grande de srcset en DevTools.

¿Cómo se abren las imágenes que se descargan como WebP o AVIF?

WebP y AVIF son formatos más recientes que generan archivos más pequeños que JPEG. La guía de formatos de imagen de MDN indica que las imágenes WebP con pérdida son de media entre un 25 % y un 35 % más pequeñas que las JPEG con un nivel de compresión similar, y que WebP tiene un soporte amplio en los navegadores actuales.

Una misma dirección puede enviar formatos distintos a programas distintos. Cuando pedimos una imagen a una CDN de imágenes, una petición simple recibió un JPEG y una petición con la cabecera Accept que envía Chrome recibió AVIF. Por eso un archivo que esperabas en .jpg llega como .webp o .avif.

En Windows 11, Paint abre archivos WebP: elige Archivo > Guardar como y selecciona JPEG. Los archivos AVIF pueden necesitar la extensión gratuita AV1 Video Extension de Microsoft, disponible en Microsoft Store. Para decenas de archivos, un conversor de imágenes por lotes hace el trabajo de una sola pasada.

Avanzado: descargar las imágenes de una página con Python

Esta sección opcional es para quien repite la tarea, por ejemplo con una copia de seguridad mensual de su propio sitio. Necesitas Python 3.10 o posterior y pip install requests beautifulsoup4. El script:

  • envía un User-Agent que nombra el script e incluye una dirección de contacto (¿Qué es el User-Agent?);
  • lee todas las etiquetas img y picture source y toma el candidato más grande de data-srcset o srcset; si no hay, usa data-src o src;
  • omite los marcadores data: incrustados y completa las direcciones relativas como ../img/photo.jpg;
  • descarga cada archivo por streaming dentro de un bloque with, como recomienda la documentación de Requests, y omite todo lo que no sea un 200 con un tipo image/;
  • nunca sobrescribe un archivo (un segundo photo.jpg pasa a llamarse photo-1.jpg) y espera un segundo después de cada dirección, incluidas las omitidas.
python
import mimetypes
import time
from pathlib import Path
from urllib.parse import urljoin, urlsplit

import requests
from bs4 import BeautifulSoup

PAGE_URL = "https://example.com/gallery/"  # una página tuya o que puedas copiar
FOLDER = Path("images")
DELAY = 1.0  # segundos entre descargas
HEADERS = {"User-Agent": "image-backup/1.0 (contact: you@example.com)"}


def largest_candidate(srcset):
    """Devuelve la URL con el mayor valor w o x de un srcset."""
    best_url, best_size = None, -1.0
    for part in srcset.split(","):
        bits = part.split()
        if not bits:
            continue
        size = 1.0
        if len(bits) > 1 and bits[1][-1] in "wx":
            size = float(bits[1][:-1])
        if size > best_size:
            best_url, best_size = bits[0], size
    return best_url


def image_urls(html, base_url):
    soup = BeautifulSoup(html, "html.parser")
    urls = []
    for tag in soup.select("img, picture source"):
        srcset = tag.get("data-srcset") or tag.get("srcset")
        url = largest_candidate(srcset) if srcset else None
        url = url or tag.get("data-src") or tag.get("src")
        if url and not url.startswith("data:"):  # omite los marcadores incrustados
            full = urljoin(base_url, url)
            if full not in urls:
                urls.append(full)
    return urls


def free_name(url, content_type):
    """Elige un nombre de archivo que no sobrescriba una descarga anterior."""
    name = Path(urlsplit(url).path).name or "image"
    stem, suffix = Path(name).stem, Path(name).suffix
    if not suffix:
        suffix = mimetypes.guess_extension(content_type.split(";")[0]) or ".img"
    target, n = FOLDER / f"{stem}{suffix}", 1
    while target.exists():
        target, n = FOLDER / f"{stem}-{n}{suffix}", n + 1
    return target


FOLDER.mkdir(exist_ok=True)
with requests.Session() as session:
    session.headers.update(HEADERS)
    page = session.get(PAGE_URL, timeout=15)
    page.raise_for_status()
    for url in image_urls(page.text, page.url):
        try:
            with session.get(url, stream=True, timeout=30) as r:
                ctype = r.headers.get("Content-Type", "")
                if r.status_code != 200 or not ctype.startswith("image/"):
                    print("skipped", r.status_code, ctype, url)
                    continue
                target = free_name(url, ctype)
                with open(target, "wb") as f:
                    for chunk in r.iter_content(chunk_size=64 * 1024):
                        f.write(chunk)
            print("saved", target.name)
        except requests.RequestException as exc:
            print("failed", url, type(exc).__name__)
        finally:
            time.sleep(DELAY)  # también se ejecuta tras un archivo omitido

Lo ejecutamos con Python 3.13, Requests 2.34.2 y Beautiful Soup 4.15.0 sobre una página de prueba local: eligió la copia 1600w en lugar de la 400w, encontró la dirección detrás de un marcador data:, mantuvo separados dos archivos photo.jpg y omitió un 404. En books.toscrape.com guardó las 20 miniaturas de la página de inicio. Empieza cada ejecución con una carpeta vacía.

No hay reintentos: cuando un servidor responde 429, lee primero Códigos de estado HTTP en web scraping. También quedan fuera las descargas en paralelo (Concurrencia y paralelismo en web scraping) y los proxies, porque una copia de seguridad de tu propio sitio no necesita ni lo uno ni lo otro. Las direcciones relativas se explican en paginación y enlaces relativos, y la lectura de atributos en nuestro tutorial de BeautifulSoup. Si trabajas en la terminal, encontrarás opciones de descarga recursiva respetuosa en Proxy con wget.

Casos de uso

Errores comunes

  • Guardar antes de desplazarte. Faltan las imágenes que se cargan durante el desplazamiento.
  • Confundir la miniatura con el original.
  • Dejar activada la pregunta de descarga. Tienes que confirmar una ventana de guardado por cada imagen.
  • Instalar una extensión sin leer sus permisos.
  • Dejar que los archivos se sobrescriban. Dos carpetas de un sitio pueden contener cada una un photo.jpg.
  • Dar por hecho que una descarga incluye derechos de uso. Revisa las condiciones del propietario o la licencia.
  • Ejecutar un script sin pausas. Cientos de peticiones por minuto desde una misma dirección pueden ralentizar un sitio pequeño, y el servidor puede responder 429 Too Many Requests.

Guía de decisión

NecesidadRecomendación
Todas las imágenes de una página, sin instalar nadaDesplázate hasta el final y usa Guardar página como > Página web completa de Chrome
Imágenes de unas pocas páginas, sin iconosUna extensión de descarga masiva con filtro de anchura; revisa sus permisos y elimínala después
Firefox, sin complementosCtrl+I > Multimedia > Seleccionar todo > Guardar como…
El tamaño original de una imagenDevTools > Red > Img, o el candidato más grande de srcset
Los archivos llegan como WebP o AVIF y necesitas JPGÁbrelos en Paint y guárdalos como JPEG; un conversor por lotes para muchos archivos
Una copia de seguridad mensual de las imágenes de tu sitioLa exportación de medios de tu CMS; si no la hay, el script de Python
Imágenes de todas las páginas de un sitioUn rastreo: primero permiso y robots.txt, después las opciones de descarga masiva de wget

Las filas de arriba son las que menos preparación requieren.

Preguntas frecuentes

¿Son seguras las extensiones de descarga masiva de imágenes?

Pueden serlo, pero la mayoría necesita permiso para leer y cambiar los datos de todos los sitios que visitas, incluidos tu correo y tu banco. Elige una con muchas reseñas, una actualización reciente y un desarrollador identificado, y elimínala cuando termines.

¿Por qué las imágenes se descargan como WebP?

El sitio envía WebP o AVIF porque los archivos son más pequeños, y tu navegador le indica al servidor que puede mostrarlos. Los navegadores actuales y Paint de Windows 11 abren WebP, y Paint puede guardarlo como JPEG.

¿Por qué las imágenes no están a tamaño completo?

Probablemente la página dio a tu pantalla una copia más pequeña de srcset, o guardaste la miniatura de la galería. Ensancha la ventana, abre la imagen grande o toma el candidato más grande en DevTools. Si el sitio solo publica copias pequeñas, no existe un archivo más grande.

¿Puedo descargar todas las imágenes de una página web desde el teléfono?

No de una sola vez con la app estándar de Chrome en Android. Puedes guardar las imágenes de una en una: mantén pulsada una imagen y toca Descargar imagen, como describe la ayuda de Google para Android. Para una página entera, usa un equipo de escritorio.

¿Puedo descargar a la vez las imágenes de todas las páginas de un sitio web?

Eso es un rastreo, es decir, un programa que sigue enlaces de página en página, y no guardar una sola página (Web scraping y web crawling). Consigue permiso, lee robots.txt y usa ajustes respetuosos como los de la sección de descarga masiva de Proxy con wget. Las empresas que necesitan rastreos a gran escala pueden ver nuestra solución de rastreador web.

¿Puedo usar las imágenes descargadas en mi propia web?

Solo si tienes derecho a hacerlo. Una descarga te da una copia, no una licencia. Tus propias fotos no plantean problemas, las imágenes de un kit de prensa siguen las condiciones del kit y las imágenes con licencia abierta siguen su licencia, que a menudo exige atribución (¿El web scraping es legal?).

En resumen

Para descargar todas las imágenes de una página web, desplázate hasta el final y después guárdala como Página web completa en Chrome, usa una extensión de descarga masiva de imágenes o recurre a la ventana Información de la página de Firefox. Las imágenes pequeñas suelen deberse a una copia más pequeña de srcset o a una imagen que aún no se había cargado, y DevTools muestra la dirección a tamaño completo. Limítate a las imágenes que puedas usar y, si tu empresa necesita recoger imágenes de forma regular y a gran escala, consulta nuestras soluciones de extracción de datos.