Javaでスクレイピング後、画像をS3/GCSに保存する方法【クラウド活用術】

JavaでWebサイトをスクレイピングし、取得した画像をAmazon S3またはGoogle Cloud Storage(GCS)にアップロードしたいと考えていませんか?
この記事では、Jsoupによる画像取得と、クラウドストレージへの保存方法をセットで解説します。


使用する主なライブラリ

  • Jsoup: HTML解析と画像URLの抽出
  • AWS SDK for Java: S3への画像保存
  • Google Cloud Client Library: GCSへのアップロード

ステップ1:画像をスクレイピングで取得

以下のコードで、Webページ内の画像URLを抽出し、ローカルに一時保存します。


import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.jsoup.select.Elements;

import java.io.*;
import java.net.URL;
import java.nio.file.*;

public class ImageScraper {
    public static void main(String[] args) throws IOException {
        String url = "https://example.com";
        Document doc = Jsoup.connect(url).get();
        Elements images = doc.select("img");

        Path downloadDir = Paths.get("downloaded_images");
        Files.createDirectories(downloadDir);

        for (Element img : images) {
            String imgUrl = img.absUrl("src");
            if (imgUrl.isEmpty()) continue;

            String fileName = Paths.get(new URL(imgUrl).getPath()).getFileName().toString();
            Path filePath = downloadDir.resolve(fileName);

            try (InputStream in = new URL(imgUrl).openStream()) {
                Files.copy(in, filePath, StandardCopyOption.REPLACE_EXISTING);
                System.out.println("保存: " + filePath);
            }
        }
    }
}

ステップ2:画像をAmazon S3にアップロード

前提準備

  • AWSアカウントとS3バケットの作成
  • AWS SDK(v2以上)をMavenに追加

<dependency>
  <groupId>software.amazon.awssdk</groupId>
  <artifactId>s3</artifactId>
  <version>2.25.14</version>
</dependency>

アップロードコード


import software.amazon.awssdk.auth.credentials.ProfileCredentialsProvider;
import software.amazon.awssdk.regions.Region;
import software.amazon.awssdk.services.s3.S3Client;
import software.amazon.awssdk.services.s3.model.*;

import java.nio.file.*;

public class S3Uploader {
    public static void main(String[] args) throws IOException {
        String bucketName = "your-s3-bucket";
        String localDir = "downloaded_images";

        S3Client s3 = S3Client.builder()
                .region(Region.AP_NORTHEAST_1) // 東京リージョンなど
                .credentialsProvider(ProfileCredentialsProvider.create())
                .build();

        Files.list(Paths.get(localDir)).forEach(path -> {
            try {
                PutObjectRequest request = PutObjectRequest.builder()
                        .bucket(bucketName)
                        .key("images/" + path.getFileName())
                        .build();

                s3.putObject(request, path);
                System.out.println("アップロード成功: " + path.getFileName());
            } catch (Exception e) {
                e.printStackTrace();
            }
        });

        s3.close();
    }
}

ステップ3:画像をGoogle Cloud Storageにアップロード

準備

  • GCPプロジェクトとバケット作成
  • サービスアカウントJSONキーを取得
  • 依存ライブラリを追加

<dependency>
  <groupId>com.google.cloud</groupId>
  <artifactId>google-cloud-storage</artifactId>
  <version>2.37.0</version>
</dependency>

アップロードコード


import com.google.cloud.storage.*;
import com.google.auth.oauth2.ServiceAccountCredentials;

import java.io.FileInputStream;
import java.nio.file.*;

public class GcsUploader {
    public static void main(String[] args) throws Exception {
        String bucketName = "your-gcs-bucket";
        String localDir = "downloaded_images";
        String credentialsPath = "path/to/credentials.json";

        Storage storage = StorageOptions.newBuilder()
                .setCredentials(ServiceAccountCredentials.fromStream(new FileInputStream(credentialsPath)))
                .build()
                .getService();

        Files.list(Paths.get(localDir)).forEach(path -> {
            try {
                BlobId blobId = BlobId.of(bucketName, "images/" + path.getFileName());
                BlobInfo blobInfo = BlobInfo.newBuilder(blobId).build();
                storage.create(blobInfo, Files.readAllBytes(path));
                System.out.println("GCSにアップロード成功: " + path.getFileName());
            } catch (Exception e) {
                e.printStackTrace();
            }
        });
    }
}

まとめ

JavaとJsoupを使ったスクレイピングに加え、クラウドストレージ(S3/GCS)への画像保存も自動化することで、より実用的なデータ収集・管理が可能になります。
ログ収集・監視・報告用途など、幅広く応用できるのでぜひご活用ください。

タイトルとURLをコピーしました