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)への画像保存も自動化することで、より実用的なデータ収集・管理が可能になります。
ログ収集・監視・報告用途など、幅広く応用できるのでぜひご活用ください。