はじめに
APIとの連携やWebスクレイピングなど、Web上の情報を取得・活用する場面は多くあります。Javaでは、標準ライブラリのHttpClient
を使ってHTTPリクエストを送信したり、Jsoup
ライブラリを使ってHTMLを解析したりすることが可能です。
この記事では、以下の2つの技術を組み合わせて、実用的なデータ取得の仕組みを解説します。
- Java 11以降で使える
HttpClient
によるAPI通信 Jsoup
を使ったHTMLスクレイピングとCSV保存
【前半】HttpClientを使ったHTTPリクエストの実装方法
HttpClientとは?
HttpURLConnection
に比べ、以下の利点があります:
- 同期・非同期の両方に対応
- ビルダー形式で読みやすい
- 標準でタイムアウトやヘッダー設定も可能
開発環境
- Java 11以降
- 特別なライブラリは不要(HttpClientは標準)
GETリクエストの例
import java.net.URI;
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;
public class GetExample {
public static void main(String[] args) throws Exception {
HttpClient client = HttpClient.newHttpClient();
HttpRequest request = HttpRequest.newBuilder()
.uri(URI.create("https://api.example.com/data"))
.build();
HttpResponse<String> response = client.send(request, HttpResponse.BodyHandlers.ofString());
System.out.println(response.body());
}
}
POSTリクエストの例(JSON送信)
import java.net.URI;
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;
import java.net.http.HttpRequest.BodyPublishers;
public class PostExample {
public static void main(String[] args) throws Exception {
String json = "{\"name\": \"John\", \"age\": 30}";
HttpRequest request = HttpRequest.newBuilder()
.uri(URI.create("https://api.example.com/users"))
.header("Content-Type", "application/json")
.POST(BodyPublishers.ofString(json))
.build();
HttpClient client = HttpClient.newHttpClient();
HttpResponse<String> response = client.send(request, HttpResponse.BodyHandlers.ofString());
System.out.println(response.body());
}
}
JSONレスポンスのパース(Jackson)
Maven依存関係:
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.16.1</version>
</dependency>
Javaコード:
import com.fasterxml.jackson.databind.ObjectMapper;
public class User {
public String name;
public int age;
}
ObjectMapper mapper = new ObjectMapper();
User user = mapper.readValue(response.body(), User.class);
System.out.println(user.name + ", " + user.age);
非同期処理
HttpClient client = HttpClient.newHttpClient();
HttpRequest request = HttpRequest.newBuilder()
.uri(URI.create("https://api.example.com/data"))
.build();
client.sendAsync(request, HttpResponse.BodyHandlers.ofString())
.thenApply(HttpResponse::body)
.thenAccept(System.out::println)
.join();
【後半】JsoupでWebページをスクレイピングしてCSV保存
ライブラリの導入(Maven)
<dependency>
<groupId>org.jsoup</groupId>
<artifactId>jsoup</artifactId>
<version>1.17.2</version>
</dependency>
HTMLを読み込んでタイトル取得
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
public class JsoupBasic {
public static void main(String[] args) throws Exception {
Document doc = Jsoup.connect("https://example.com").get();
System.out.println("ページタイトル: " + doc.title());
}
}
見出し・リンクを抽出
import org.jsoup.nodes.Element;
import org.jsoup.select.Elements;
Document doc = Jsoup.connect("https://example.com").get();
Elements headings = doc.select("h2");
for (Element h : headings) {
System.out.println("見出し: " + h.text());
}
Elements links = doc.select("a[href]");
for (Element a : links) {
System.out.println("リンク: " + a.attr("abs:href"));
}
抽出結果をCSV保存
import java.io.FileWriter;
import java.io.PrintWriter;
try (PrintWriter pw = new PrintWriter(new FileWriter("links.csv", false))) {
pw.println("テキスト,URL");
for (Element a : links) {
String text = a.text().replace(",", " ");
String href = a.attr("abs:href");
pw.println(text + "," + href);
}
}
System.out.println("CSVに保存しました。");
まとめ
JavaはHttpClient
とJsoup
を使えば、APIとの連携もスクレイピングも簡単に実現できます。特にデータの取得 → 解析 → CSV出力の流れは、実務や業務効率化に直結します。