JavaでWebサイトから画像を抽出する方法

Aspose.HTML for Java はWebページをHTMLDocumentに読み込み、HTML DOMを通じて要素へのアクセスを提供します。<img>要素を収集し、それぞれのsrc属性を読み取り、相対パスをドキュメントのベースURIに基づいて解決して、ドキュメントのネットワークサービスから各画像をリクエストします。

この処理は、ページから参照されているリソースのバイトをダウンロードし、画像の変換や再エンコードは行いません。そのため、JPEG、PNG、GIF、WebP、SVGなどの画像形式は、サーバーから返された形式のまま保存されます。


JavaでWebサイトの画像をダウンロード

この例では公開Webページを開き、重複しないsrc値を収集して、成功したレスポンスをimagesディレクトリに保存します。数値の接頭辞を付けることで、URLパスのファイル名が同じ画像による上書きを防ぎます。

JavaでWebサイトから画像を抽出

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()で書き込みます。

Webサイトから抽出できる画像

この例は、<img>要素のsrc属性から直接参照されているネットワークリソースを抽出します。各リクエストを送信する前に、ドキュメントの<base>要素によって影響を受けるパスを含め、相対パスを絶対URLに解決します。同じリクエスト方法は、DOMまたはCSSで別のリソースURLを検出した場合にも利用できます。

ドキュメントの完全な例については、 Extract Images From Website in Java を参照してください。


画像抽出時の注意点

  • 取得した画像形式を維持してください。 コードは変換せずにレスポンス本文を保存します。URLに有効な拡張子がない場合は、レスポンスのContent-Typeを確認して適切なローカル名を指定してください。
  • ファイル名の重複を避けてください。 異なる画像URLが同じファイル名で終わる場合があります。この例では数値の接頭辞を使用していますが、実運用ではハッシュなどの安定した命名規則も使用できます。
  • すべてのレスポンスを確認してください。 画像リクエストが画像のバイトではなく、エラーページ、認証レスポンス、リダイレクト、または利用できないリソースを返す場合があります。
  • 大きなリソースを考慮してください。 readAsByteArray()は画像全体をメモリに保持します。ページが大きなファイルや多数の画像を参照する場合は、ストリーミング方式を使用してください。
  • 信頼できない参照元を検証してください。 ページURLや画像パスがユーザーから渡される場合は、許可するスキームとホストを制限し、承認されたディレクトリ内だけにファイルを保存します。
  • 著作権とWebサイトの利用条件を守ってください。 所有している画像、または利用許可のある画像だけを抽出して再利用してください。公開されている画像でも、複製、再配布、商用利用が自動的に許可されるわけではありません。

よくある質問

1. HTMLからレスポンシブ画像や遅延読み込み画像を抽出するにはどうすればよいですか?

対象ページのsrc、srcset、<picture><source>要素に加え、遅延読み込み用の画像URLを保持するdata-srcなどのサイト固有属性を確認します。選択したURLをリクエストする前に、ドキュメントのベースURIに基づいて解決してください。

2. WebサイトからCSSの背景画像を抽出するにはどうすればよいですか?

外部スタイルシートとインラインstyle属性からbackground-image宣言を探します。各CSS url()値をスタイルシートまたはドキュメントのベースURLに基づいて解決し、参照されているリソースを個別にリクエストして保存します。

3. 画像を抽出してもJPEG、PNG、GIF、WebP、SVG形式は維持されますか?

ダウンロードしたレスポンスのバイトを再エンコードせずに保存すると、サーバーが返した画像形式が維持されます。リソースURLに信頼できる拡張子がない場合は、レスポンスのContent-Typeを使用してローカルファイル名を決定してください。

4. Aspose.HTML for JavaはWebサイトのアイコンも抽出できますか?

Webサイトのアイコンは一般に、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の各ページを参照できます。