Как извлечь изображения с сайта на Java

Aspose.HTML for Java загружает веб-страницу в объект HTMLDocument и предоставляет доступ к её элементам через HTML DOM. Соберите элементы <img>, прочитайте каждый атрибут src, разрешите относительные пути по базовому URI документа и запросите изображения через сетевой сервис документа.

При таком подходе скачиваются данные ресурсов, на которые ссылается страница. Изображения не преобразуются и не перекодируются, поэтому файлы JPEG, PNG, GIF, WebP, SVG и других форматов сохраняются в том виде, в котором их вернул сервер.


Скачивание изображений с сайта на Java

Пример открывает общедоступную веб-страницу, собирает уникальные значения src и сохраняет успешные ответы в каталог images. Числовые префиксы не позволяют файлам с одинаковыми именами в URL перезаписывать друг друга.

Извлечение изображений с сайта на 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++;
    }
}

Как извлечь изображения из HTML

  1. Загрузите целевую страницу с помощью HTMLDocument .
  2. Вызовите getElementsByTagName("img") , чтобы получить элементы изображений.
  3. Прочитайте непустые значения src и оставьте только уникальные адреса ресурсов.
  4. Разрешите каждый относительный адрес с помощью класса Url и метода document.getBaseURI().
  5. Отправьте RequestMessage для каждого изображения и проверьте полученный ResponseMessage .
  6. Создайте уникальное локальное имя и запишите данные ответа методом Files.write().

Какие изображения можно извлечь с сайта

Пример извлекает сетевые ресурсы, на которые напрямую ссылается атрибут src элементов <img>. Перед отправкой запроса он также разрешает относительные пути, включая адреса, на которые влияет элемент <base> документа. Тот же способ отправки запросов можно применять к другим URL ресурсов после их обнаружения в DOM или CSS.

Полный пример приведён в статье Извлечение изображений с веб-сайта .


Что учитывать при извлечении изображений

  • Сохраняйте полученный формат изображения. Код записывает тело ответа без преобразования. Если в URL нет подходящего расширения, проверьте тип содержимого ответа и задайте соответствующее имя локального файла.
  • Не допускайте совпадения имён. Разные URL изображений могут оканчиваться одинаковым именем файла. В примере добавляется числовой префикс, а в рабочем приложении можно использовать хеш или другое стабильное правило именования.
  • Проверяйте каждый ответ. Запрос изображения может вернуть страницу ошибки, ответ системы аутентификации, перенаправление или сообщение о недоступном ресурсе вместо данных изображения.
  • Учитывайте размер ресурсов. Метод readAsByteArray() буферизует всё изображение в памяти. Используйте потоковую загрузку, если страницы могут содержать много изображений или ссылаться на большие файлы.
  • Проверяйте недоверенные источники. Ограничивайте допустимые схемы и хосты, если URL страницы или пути изображений поступают от пользователей, и сохраняйте файлы только в разрешённом каталоге.
  • Соблюдайте авторские права и условия сайта. Извлекайте и используйте только собственные изображения или ресурсы, на доступ к которым у вас есть разрешение. Публичная доступность не даёт права копировать, распространять или использовать изображение в коммерческих целях.

Часто задаваемые вопросы

1. Как извлечь адаптивные и отложенно загружаемые изображения?

Проверьте атрибуты src и srcset, элементы <picture><source>, а также специальные атрибуты страницы, например data-src, в которых хранятся адреса отложенно загружаемых изображений. Перед запросом разрешите каждый URL относительно базового URI документа.

2. Как извлечь фоновые изображения CSS с веб-сайта?

Найдите объявления background-image во внешних таблицах стилей и атрибутах style. Разрешите каждое значение CSS url() относительно базового URL таблицы стилей или документа, затем отдельно запросите и сохраните указанный ресурс.

3. Сохраняются ли форматы JPEG, PNG, GIF, WebP и SVG при извлечении?

Запись полученных данных без перекодирования сохраняет формат изображения, возвращённый сервером. Если URL ресурса не содержит надёжного расширения, используйте тип содержимого ответа для выбора имени локального файла.

4. Можно ли извлечь значки сайта с помощью Aspose.HTML for Java?

Значки сайта обычно задаются элементами <link>, у которых значение rel содержит icon. Соберите эти элементы, прочитайте их атрибуты href, разрешите относительные URL и скачайте ресурсы через сетевой сервис документа.


Установка Aspose.HTML for Java

Добавьте Aspose.HTML for Java из официального репозитория Aspose. Замените ASPOSE_HTML_VERSION точным номером версии со страницы выпусков Aspose.HTML for Java , затем перезагрузите или пересоберите проект, чтобы система зависимостей загрузила библиотеку.

Добавьте репозиторий и зависимость в проект 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>

Добавьте репозиторий и зависимость в проект Gradle:

Gradle – build.gradle

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

Используйте версию JDK, совместимую с выбранным выпуском библиотеки. Инструкции по установке JAR вручную, настройке Kotlin DSL, обновлению и устранению проблем с зависимостями приведены в руководстве Установка Aspose.HTML for Java .

Другие задачи извлечения данных на Java

Перейдите к загрузке файлов по URL, извлечению SVG, обзору раздела или странице Aspose.HTML for Java.