Java
 Computer >> コンピューター >  >> プログラミング >> Java

JavaでWebページのコンテンツを文字列として取得する3つの方法【openStream・HttpClient・Jsoup】

Javaでは、いくつかの方法を使ってWebページの内容を読み込むことができます。本記事では、代表的な3つの手法をコード例とともにわかりやすく解説します。

1. URLクラスのopenStream()メソッドを使う方法

java.netパッケージのURLクラスは、Uniform Resource Locator(URL)を表すクラスで、World Wide Web上のリソース(ファイル、ディレクトリ、参照など)を指し示すために使用されます。

このクラスが持つopenStream()メソッドは、現在のオブジェクトが表すURLへの接続を開き、InputStreamオブジェクトを返します。このInputStreamを使えば、URLからデータを読み取ることができます。

したがって、URLクラスを使ってWebページからデータを読み込む手順は以下のとおりです。

  • 目的のWebページのURLを引数としてコンストラクタに渡し、java.net.URLクラスをインスタンス化します。
  • openStream()メソッドを呼び出して、InputStreamオブジェクトを取得します。
  • 取得したInputStreamオブジェクトを引数に渡して、Scannerクラスをインスタンス化します。

サンプルコード

import java.io.IOException;
import java.net.URL;
import java.util.Scanner;

public class ReadingWebPage {
    public static void main(String args[]) throws IOException {
        // URLクラスのインスタンス化
        URL url = new URL("https://www.something.com/");
        // 指定したページの内容を取得
        Scanner sc = new Scanner(url.openStream());
        // 結果を保持するためのStringBufferをインスタンス化
        StringBuffer sb = new StringBuffer();
        while(sc.hasNext()) {
            sb.append(sc.next());
        }
        // StringBufferからStringを取り出す
        String result = sb.toString();
        System.out.println(result);
        // HTMLタグを除去
        result = result.replaceAll("<[^>]*>", "");
        System.out.println("Contents of the web page: " + result);
    }
}

実行結果

<html><body><h1>Itworks!</h1></body></html>
Contents of the web page: Itworks!

2. HttpClientライブラリを使う方法

Http Clientはクライアント側で動作する転送ライブラリで、HTTPメッセージの送受信を行います。最新のHTTP標準に準拠した、機能豊富で効率的な実装を提供しています。

HTTPプロトコルのGETリクエストは、指定されたURIを使ってサーバーから情報を取得するために使われます。GETリクエストはデータの取得のみを行い、データに対して他の影響を与えてはいけません。

HttpClient APIには、GETリクエストを表すHttpGetというクラスが用意されています。GETリクエストを実行してWebページの内容を取得する手順は以下のとおりです。

  • HttpClientsクラスのcreateDefault()メソッドは、HttpClientインターフェースの基本実装であるCloseableHttpClientオブジェクトを返します。このメソッドでHttpClientオブジェクトを作成します。
  • HttpGetクラスをインスタンス化してHTTP GETリクエストを作成します。コンストラクタには、リクエスト送信先のWebページのURIを表す文字列を指定します。
  • execute()メソッドを呼び出して、HttpGetリクエストを実行します。
  • レスポンスから、Webサイトのコンテンツを表すInputStreamオブジェクトを以下のように取得します。
httpresponse.getEntity().getContent()

サンプルコード

import java.util.Scanner;
import org.apache.http.HttpResponse;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;

public class HttpClientExample {
    public static void main(String args[]) throws Exception {
        // HttpClientオブジェクトの作成
        CloseableHttpClient httpclient = HttpClients.createDefault();
        // HttpGetオブジェクトの作成
        HttpGet httpget = new HttpGet("https://www.something.com/");
        // GETリクエストの実行
        HttpResponse httpresponse = httpclient.execute(httpget);
        Scanner sc = new Scanner(httpresponse.getEntity().getContent());
        // 結果を保持するためのStringBufferをインスタンス化
        StringBuffer sb = new StringBuffer();
        while(sc.hasNext()) {
            sb.append(sc.next());
        }
        // StringBufferからStringを取り出す
        String result = sb.toString();
        System.out.println(result);
        // HTMLタグを除去
        result = result.replaceAll("<[^>]*>", "");
        System.out.println("Contents of the web page: " + result);
    }
}

実行結果

<html><body><h1>Itworks!</h1></body></html>
Contents of the web page: Itworks!

3. Jsoupライブラリを使う方法

Jsoupは、HTMLベースのコンテンツを扱うためのJavaライブラリです。DOM・CSS・jQuery風のメソッドの長所を活かした、非常に使いやすいAPIでデータの抽出や操作を行えます。WHATWG HTML5仕様を実装しており、モダンブラウザと同じようにHTMLをパースしてDOMを構築します。

Jsoupライブラリを使ってWebページの内容を取得する手順は以下のとおりです。

  • Jsoupクラスのconnect()メソッドにWebページのURLを渡すと、指定されたページに接続し、接続オブジェクト(Connection)を返します。
  • Connectionインターフェースのget()メソッドはGETリクエストを実行し、DocumentクラスのオブジェクトとしてHTMLドキュメントを返します。get()メソッドを呼び出してページにGETリクエストを送信します。
  • 取得したドキュメントの内容を、次のように文字列として取り出します。
String result = doc.body().text();

サンプルコード

import java.io.IOException;
import org.jsoup.Connection;
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;

public class JsoupExample {
    public static void main(String args[]) throws IOException {
        String page = "https://www.something.com/";
        // Webページへの接続
        Connection conn = Jsoup.connect(page);
        // GETリクエストの実行
        Document doc = conn.get();
        // Webページの本文を取得
        String result = doc.body().text();
        System.out.println(result);
    }
}

実行結果

It works!

まとめ

このように、JavaでWebページの内容を文字列として取得する方法は主に3つあります。

  • URLクラス+openStream(): JDK標準ライブラリだけで完結し、追加の依存関係が不要。シンプルな用途に最適。
  • Apache HttpClient: HTTP通信を細かく制御でき、ヘッダーの操作や認証など高度な処理にも対応可能。
  • Jsoup: HTMLのパースや要素の抽出に強く、スクレイピング用途では最も便利。

用途に応じて適切な方法を選択しましょう。単純なデータ取得なら標準ライブラリ、柔軟なHTTP制御が必要ならHttpClient、HTML解析が必要ならJsoupがおすすめです。

  1. JavaでCSVファイルを読み込む方法|BufferedReaderによる基本的なデータ読み取り手順

    CSVとは「Comma Separated Values(カンマ区切り値)」の略で、テキスト形式のデータファイルの一種です。CSVファイルでは、1行ごとに複数の項目がカンマ(,)で区切られて記録されており、拡張子は「.csv」として保存されます。表形式のデータを扱う際に広く利用されている、シンプルで汎用性の高いフォーマットです。 JavaでCSVファイルを読み込む仕組み JavaでCSVファイルを読み込むには、BufferedReaderクラスのreadLine()メソッドを使用するのが基本的な方法です。このメソッドを使うと、ファイルの内容を1行ずつ順番に読み取ることができます。 読み取った各

  2. Javaでプロパティファイルからデータを読み取る方法を解説

    JavaのPropertiesクラスは、Hashtableクラスのサブクラスであり、永続化可能なプロパティの集合(プロパティセット)を表します。Propertiesオブジェクトはストリームへ保存したり、ストリームから読み込んだりすることができます。また、プロパティリスト内の各キーとそれに対応する値は、どちらも文字列型として扱われます。Javaでは、Propertiesファイルを使うことでアプリケーションの設定情報を外部化し、キーと値(key-value)のペアとして管理できます。Propertiesクラスが提供するload()メソッドを使用すると、.propertiesファイルに記述されたキー