はじめに
Webサイト上の画像を一括でダウンロードしたい場合、Java × Jsoupを使えば比較的シンプルに実現できます。
本記事では、Javaで以下の処理を行う方法を紹介します。
- 指定URLのHTMLを解析
<img>
タグから画像URLを抽出- 各画像をローカルに保存
スクレイピングや自動収集処理を学びたい方にもおすすめの内容です。
前提環境
- Java 8以上
- Jsoup(HTMLパーサライブラリ)
- ネット接続されたPC
Mavenの場合、以下をpom.xml
に追加してください。
<dependency>
<groupId>org.jsoup</groupId>
<artifactId>jsoup</artifactId>
<version>1.17.2</version>
</dependency>
実装の全体フロー
- JsoupでWebページを取得
<img>
タグのsrc
属性を抽出- 相対パスを絶対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.net.HttpURLConnection;
public class ImageDownloader {
public static void main(String[] args) {
String url = "https://example.com"; // 対象URL
String saveDir = "images/"; // 保存先ディレクトリ
new File(saveDir).mkdirs();
try {
Document doc = Jsoup.connect(url).get();
Elements images = doc.select("img");
int count = 1;
for (Element img : images) {
String src = img.absUrl("src");
if (src.isEmpty()) continue;
System.out.println("画像URL: " + src);
downloadImage(src, saveDir + "image" + (count++) + getExtension(src));
}
System.out.println("完了しました。");
} catch (IOException e) {
e.printStackTrace();
}
}
private static void downloadImage(String imageUrl, String savePath) {
try (InputStream in = new URL(imageUrl).openStream();
OutputStream out = new FileOutputStream(savePath)) {
byte[] buffer = new byte[4096];
int n;
while ((n = in.read(buffer)) != -1) {
out.write(buffer, 0, n);
}
System.out.println("保存: " + savePath);
} catch (IOException e) {
System.err.println("エラー: " + imageUrl);
}
}
private static String getExtension(String url) {
int lastDot = url.lastIndexOf('.');
if (lastDot != -1 && lastDot + 1 < url.length()) {
return url.substring(lastDot);
} else {
return ".jpg"; // デフォルト拡張子
}
}
}
実行結果例
画像URL: https://example.com/images/logo.png
保存: images/image1.png
画像URL: https://example.com/assets/banner.jpg
保存: images/image2.jpg
完了しました。
注意点
項目 | 内容 |
---|---|
著作権 | 商用サイトからの画像収集は著作権に注意 |
アクセス制限 | robots.txtや403対策も確認 |
遅延実装 | アクセス間隔にThread.sleep() を入れると良い |
応用例
- サブディレクトリの画像も再帰取得
.png
,.jpg
など特定の拡張子に限定- 保存ファイル名に元のURL名を使用
まとめ
JavaでWebサイトの画像を取得するには、Jsoupと標準のIOだけで簡単に構築できます。
Webスクレイピングの入門としても実用的な例です。