JavaでHTTPリクエストとWebスクレイピングを行う方法【HttpClientとJsoupの実例付き】

はじめに

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出力の流れは、実務や業務効率化に直結します。

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