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++;
    }
}

Java에서 HTML 이미지를 추출하는 단계

  1. HTMLDocument 로 대상 페이지를 로드합니다.
  2. getElementsByTagName("img") 을 호출하여 이미지 요소를 수집합니다.
  3. 비어 있지 않은 각 src 값을 읽고 중복된 소스는 제외합니다.
  4. Url 과 document.getBaseURI()를 사용하여 각 상대 소스를 절대 URL로 해석합니다.
  5. 이미지마다 RequestMessage 를 보내고 ResponseMessage 를 확인합니다.
  6. 고유한 로컬 이름을 만들고 응답 바이트를 Files.write()로 기록합니다.

웹사이트에서 추출할 수 있는 이미지

이 예제는 <img> 요소의 src 속성에서 직접 참조하는 네트워크 리소스를 추출합니다. 각 요청을 보내기 전에 문서의 <base> 요소에 영향을 받는 경로를 포함하여 상대 경로를 절대 URL로 해석합니다. DOM 또는 CSS에서 다른 리소스 URL을 찾은 경우에도 같은 요청 방식을 적용할 수 있습니다.

전체 문서 예제는 Extract Images From Website in Java 를 참조하세요.


이미지 추출 시 확인할 사항

  • 받은 이미지 형식을 유지하세요. 코드는 변환 없이 응답 본문을 저장합니다. URL에 유효한 확장자가 없으면 응답의 Content-Type을 확인하여 적절한 로컬 이름을 지정하세요.
  • 파일 이름 충돌을 방지하세요. 서로 다른 이미지 URL이 같은 파일 이름으로 끝날 수 있습니다. 예제는 숫자 접두사를 추가하지만 실제 애플리케이션에서는 해시 또는 다른 안정적인 이름 지정 규칙을 사용할 수 있습니다.
  • 모든 응답을 확인하세요. 이미지 요청이 이미지 바이트 대신 오류 페이지, 인증 응답, 리디렉션 또는 사용할 수 없는 리소스를 반환할 수 있습니다.
  • 대용량 리소스를 고려하세요. readAsByteArray()는 이미지 전체를 메모리에 버퍼링합니다. 페이지가 큰 파일이나 많은 이미지를 참조할 수 있다면 스트리밍 방식을 사용하세요.
  • 신뢰할 수 없는 소스를 검증하세요. 페이지 URL 또는 이미지 경로가 사용자에게서 제공되는 경우 허용할 스킴과 호스트를 제한하고 승인된 디렉터리 안에만 파일을 저장하세요.
  • 저작권과 웹사이트 이용 약관을 준수하세요. 소유하고 있거나 사용 권한이 있는 이미지만 추출하고 재사용하세요. 공개되어 있다는 이유만으로 이미지의 복사, 재배포 또는 상업적 이용이 허용되는 것은 아닙니다.

자주 묻는 질문

1. HTML에서 반응형 이미지와 지연 로딩 이미지를 추출하려면 어떻게 해야 하나요?

대상 페이지의 src, srcset, <picture><source> 요소와 지연 이미지 URL을 저장하는 data-src 같은 사이트별 속성을 확인합니다. 선택한 URL을 요청하기 전에 문서의 기본 URI를 기준으로 해석하세요.

2. 웹사이트에서 CSS 배경 이미지를 추출하려면 어떻게 해야 하나요?

외부 스타일시트와 인라인 style 속성에서 background-image 선언을 찾습니다. 각 CSS url() 값을 스타일시트 또는 문서의 기본 URL을 기준으로 해석한 뒤 참조된 리소스를 별도로 요청하여 저장합니다.

3. 이미지를 추출해도 JPEG, PNG, GIF, WebP 및 SVG 형식이 유지되나요?

다운로드한 응답 바이트를 다시 인코딩하지 않고 저장하면 서버에서 반환된 이미지 형식이 유지됩니다. 리소스 URL에 신뢰할 수 있는 확장자가 없으면 응답의 Content-Type을 사용하여 로컬 파일 이름을 정하세요.

4. Aspose.HTML for Java로 웹사이트 아이콘도 추출할 수 있나요?

웹사이트 아이콘은 일반적으로 rel 값에 icon이 포함된 <link> 요소에서 참조됩니다. 해당 요소를 수집하고 href 속성을 읽은 다음 상대 URL을 해석하여 문서 네트워크 서비스를 통해 리소스를 다운로드합니다.


Aspose.HTML for Java 설치

Aspose 공식 리포지토리에서 Aspose.HTML for Java를 추가합니다. ASPOSE_HTML_VERSION을 Aspose.HTML for Java releases 페이지에 표시된 정확한 버전으로 바꾼 다음, 프로젝트를 다시 로드하거나 빌드하여 종속성을 확인합니다.

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, 업데이트 및 종속성 문제 해결은 Install Aspose.HTML for Java 를 참조하세요.

관련 Java 데이터 추출 작업

URL 다운로드, SVG 추출, 데이터 추출 개요 또는 Aspose.HTML for Java 페이지를 계속 살펴보세요.