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がおすすめです。
-
JavaでCSVファイルを読み込む方法|BufferedReaderによる基本的なデータ読み取り手順
CSVとは「Comma Separated Values(カンマ区切り値)」の略で、テキスト形式のデータファイルの一種です。CSVファイルでは、1行ごとに複数の項目がカンマ(,)で区切られて記録されており、拡張子は「.csv」として保存されます。表形式のデータを扱う際に広く利用されている、シンプルで汎用性の高いフォーマットです。 JavaでCSVファイルを読み込む仕組み JavaでCSVファイルを読み込むには、BufferedReaderクラスのreadLine()メソッドを使用するのが基本的な方法です。このメソッドを使うと、ファイルの内容を1行ずつ順番に読み取ることができます。 読み取った各
-
Javaでプロパティファイルからデータを読み取る方法を解説
JavaのPropertiesクラスは、Hashtableクラスのサブクラスであり、永続化可能なプロパティの集合(プロパティセット)を表します。Propertiesオブジェクトはストリームへ保存したり、ストリームから読み込んだりすることができます。また、プロパティリスト内の各キーとそれに対応する値は、どちらも文字列型として扱われます。Javaでは、Propertiesファイルを使うことでアプリケーションの設定情報を外部化し、キーと値(key-value)のペアとして管理できます。Propertiesクラスが提供するload()メソッドを使用すると、.propertiesファイルに記述されたキー