Javaでスクレイピングする方法【JsoupでHTML解析】


はじめに

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はHttpClientJsoupを使えば、APIとの連携もスクレイピングも簡単に実現できます。特にデータの取得 → 解析 → CSV出力の流れは、実務や業務効率化に直結します。

WordPressでもこのような技術記事を投稿することで、SEOにも強く、エンジニア読者にとっても価値のある情報発信が可能です。

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