Extraer imágenes de un sitio web en Java

Aspose.HTML for Java carga una página web en un HTMLDocument y permite acceder a sus elementos mediante el DOM HTML. Reúna los elementos <img>, lea el atributo src de cada uno, resuelva las rutas relativas con respecto a la URI base del documento y solicite cada imagen mediante el servicio de red del documento.

Este proceso descarga los bytes del recurso referenciado por la página, sin convertir ni volver a codificar las imágenes. Por tanto, JPEG, PNG, GIF, WebP, SVG y otros formatos de imagen se conservan tal como los devuelve el servidor.


Descargar imágenes de un sitio web en Java

El ejemplo abre una página web pública, reúne valores src únicos y guarda las respuestas correctas en el directorio images. Los prefijos numéricos evitan que los archivos con el mismo nombre en la ruta URL se sobrescriban entre sí.

Extraer imágenes de un sitio web en Java

Path outputDirectory = Paths.get("images");
Files.createDirectories(outputDirectory);

try (HTMLDocument document = new HTMLDocument("https://docs.aspose.com/html/java/web-accessibility-rules/")) {
    // Collect distinct image sources from the HTML document
    HTMLCollection images = document.getElementsByTagName("img");
    Set<String> sources = new LinkedHashSet<>();

    for (Element image : images) {
        String source = image.getAttribute("src");
        if (!source.isEmpty()) {
            sources.add(source);
        }
    }

    int imageNumber = 1;
    for (String source : sources) {
        // Resolve a relative source against the document base URI
        Url imageUrl = new Url(source, document.getBaseURI());
        RequestMessage request = new RequestMessage(imageUrl);
        ResponseMessage response = document.getContext().getNetwork().send(request);

        if (!response.isSuccess()) {
            continue;
        }

        Path urlPath = Paths.get(imageUrl.getPathname());
        Path name = urlPath.getFileName();
        String fileName = name == null || name.toString().isEmpty()
            ? "image"
            : name.toString();
        Path outputPath = outputDirectory.resolve(imageNumber + "-" + fileName);

        // Save the original response bytes
        Files.write(outputPath, response.getContent().readAsByteArray());
        imageNumber++;
    }
}

Pasos para extraer imágenes de HTML en Java

  1. Cargue la página de destino con HTMLDocument .
  2. Llame a getElementsByTagName("img") para reunir los elementos de imagen.
  3. Lea cada valor src no vacío y conserve únicamente los orígenes distintos.
  4. Resuelva cada origen relativo con Url y document.getBaseURI().
  5. Envíe un RequestMessage para cada imagen y compruebe el ResponseMessage .
  6. Cree un nombre local único y escriba los bytes de la respuesta con Files.write().

Qué imágenes se pueden extraer de un sitio web

El ejemplo extrae recursos de red referenciados directamente por el atributo src de los elementos <img>. También resuelve las rutas relativas, incluidas las afectadas por un elemento <base> del documento, antes de enviar cada solicitud. El mismo patrón de solicitud puede aplicarse a otras URL de recursos después de encontrarlas en el DOM o en CSS.

Para consultar el ejemplo completo de la documentación, lea Extraer imágenes de un sitio web – Ejemplos Java .


Aspectos importantes al extraer imágenes

  • Conserve el formato de imagen recibido. El código guarda el cuerpo de la respuesta sin convertirlo. Si una URL no contiene una extensión útil, examine el tipo de contenido de la respuesta y asigne un nombre local adecuado.
  • Evite nombres de archivo duplicados. Distintas URL de imagen pueden terminar con el mismo nombre. El ejemplo añade un prefijo numérico, pero una aplicación de producción puede utilizar un hash u otra regla de nombres estable.
  • Compruebe todas las respuestas. Una solicitud de imagen puede devolver una página de error, una respuesta de autenticación, una redirección o un recurso no disponible en lugar de los bytes de la imagen.
  • Tenga en cuenta los recursos grandes. readAsByteArray() almacena la imagen completa en memoria. Utilice una estrategia de streaming cuando las páginas puedan referenciar archivos grandes o numerosas imágenes.
  • Valide los orígenes que no sean de confianza. Restrinja los esquemas y hosts permitidos cuando la URL de la página o las rutas de imagen procedan de usuarios, y guarde los archivos únicamente en un directorio autorizado.
  • Respete los derechos de autor y las condiciones del sitio web. Extraiga y reutilice solo imágenes propias o para las que tenga autorización. La disponibilidad pública no concede permiso para copiar, redistribuir o utilizar comercialmente una imagen.

Preguntas frecuentes

1. ¿Cómo se extraen de HTML las imágenes adaptables y de carga diferida?

Examine src, srcset y los elementos <picture><source>, además de atributos específicos del sitio como data-src que almacenan URL de imágenes aplazadas. Resuelva cada URL seleccionada con respecto a la URI base del documento antes de solicitar el recurso.

2. ¿Cómo se extraen las imágenes de fondo CSS de un sitio web?

Examine las hojas de estilos externas y los atributos style en línea para buscar declaraciones background-image. Resuelva cada valor CSS url() con respecto a la URL base de la hoja de estilos o del documento y solicite y guarde después el recurso referenciado por separado.

3. ¿La extracción de imágenes conserva los archivos JPEG, PNG, GIF, WebP y SVG?

Guardar los bytes descargados de la respuesta sin volver a codificarlos conserva el formato de imagen devuelto por el servidor. Si la URL del recurso no contiene una extensión fiable, utilice el tipo de contenido de la respuesta para elegir el nombre del archivo local.

4. ¿Puede Aspose.HTML for Java extraer los iconos de un sitio web?

Los iconos de un sitio web suelen estar referenciados por elementos <link> cuyo valor rel contiene icon. Reúna esos elementos, lea sus atributos href, resuelva las URL relativas y descargue los recursos mediante el servicio de red del documento.


Instalar Aspose.HTML for Java

Añada Aspose.HTML for Java desde el repositorio oficial de Aspose. Sustituya ASPOSE_HTML_VERSION por un número de versión exacto de la página de versiones de Aspose.HTML for Java y, a continuación, vuelva a cargar o compilar el proyecto para resolver la dependencia.

Añada el repositorio y la dependencia al proyecto Maven:

Maven – pom.xml

<repositories>
    <repository>
        <id>AsposeJavaAPI</id>
        <url>https://releases.aspose.com/java/repo/</url>
    </repository>
</repositories>
<dependencies>
    <dependency>
        <groupId>com.aspose</groupId>
        <artifactId>aspose-html</artifactId>
        <version>ASPOSE_HTML_VERSION</version>
    </dependency>
</dependencies>

Añada el repositorio y la dependencia al proyecto Gradle:

Gradle – build.gradle

repositories {
    maven {
        url = uri('https://releases.aspose.com/java/repo/')
    }
}
dependencies {
    implementation 'com.aspose:aspose-html:ASPOSE_HTML_VERSION'
}

Utilice una versión del JDK compatible con la versión seleccionada. Consulte Instalación – Aspose.HTML for Java para obtener instrucciones sobre la instalación manual del archivo JAR, Kotlin DSL, las actualizaciones y la solución de problemas de dependencias.

Tareas relacionadas de extracción de datos en Java

Continúe con las descargas desde URL, la extracción de SVG, la página principal de extracción de datos o Aspose.HTML for Java.