【Java】Jsoupを使ったWebスクレイピングのサンプルコードを解説
この記事では、JavaでWebスクレイピングを行うJsoupライブラリの基本的な使い方を学びます。MavenプロジェクトのセットアップからJsoupの導入、WebページのHTML取得、CSSセレクタを使ったタイトルやURLの抽出まで、サンプルコードを通して実践的に解説します。初心者の方もWebから情報を自動収集する技術を習得できます。
開発環境
- Visual Studio Code:version 1.73.0
- OS:Windows10
- jsoup:1.18.2
JavaのJsoupとは
Jsoup(ジェイスープ)とは、Javaというプログラミング言語で使うためのライブラリです。ライブラリとは、プログラムでよく使う機能をまとめたもので、これを使うと効率的に開発を進めることができます。Jsoupは、主にWebページを構成するHTMLの情報を取得し、その内容を解析するために利用されます。
Jsoupを使うと、次のようなことができます。 まず、指定したURL(Webページのインターネット上の住所)にリクエストを送ります。これは、Webサーバーに対して「このページのHTML情報をください」とお願いすることに当たります。その後、サーバーから送られてきたHTMLの情報を取得します。
次に、取得したHTMLの中から、必要なデータを検索して取り出すことができます。この検索には「CSSセレクタ」という仕組みを利用します。CSSセレクタとは、HTMLの特定の要素(見出しや段落、画像など)を指定するための書き方です。Jsoupは、このCSSセレクタを使ってHTMLの中から目的の「要素」(Webページを構成する部品のこと)を探し出し、そこから必要なデータ(文字やリンクのアドレスなど)を抽出する作業を行います。
ただし、Jsoupには一つ注意点があります。Jsoupは、Webページが最初に読み込まれた時点のHTML情報を解析するライブラリです。そのため、ユーザーがボタンをクリックしたり、スクロールしたりするなど、Webページが読み込まれた後にJavaScriptなどのプログラムによって内容が変化する「動的なページ」の情報は、そのままでは取得できません。動的なページでは、ユーザーの操作によって「DOM」(Webページの内容をプログラムが扱いやすいように木構造で表現したもの)が後から生成されたり、変更されたりするからです。
もし、このような動的なページの情報を取得したい場合には、Seleniumという別のライブラリを使用します。Seleniumは、Webブラウザを実際に操作して、ユーザーが行うような動作をシミュレートしながら情報を取得することができるツールです。
Jsoupの公式ドキュメントは、以下のURLで確認できます。 公式ドキュメント:https://jsoup.org/
JavaのJsoupの使い方
JavaのJsoupの使い方を解説していきます。Jsoupは、JavaでWebページ(HTML)から特定の情報を取得したり、HTMLを操作したりするための便利なライブラリです。Webサイトの情報を自動的に取得したい場合などに利用されます。
Mavenプロジェクトを作成
まずはMavenで新規プロジェクトを作成します。 Mavenとは、Javaのプロジェクトを管理するためのツールです。プロジェクトの作成、必要なライブラリのダウンロード、プログラムのビルド(実行可能なファイルにまとめること)などを簡単に行うことができます。
以下のコマンドを実行して、新しいJavaプロジェクトを作成します。
1mvn archetype:generate -DgroupId=com.example -DartifactId=google-scraper -DarchetypeArtifactId=maven-archetype-quickstart -DinteractiveMode=false
このコマンドの各オプションについて説明します。
-DgroupIdには、プロジェクトのパッケージ名(例:com.example)を指定します。これは、Javaのクラスを整理するための名前空間です。-DartifactIdには、プロジェクトの名前(例:google-scraper)を指定します。-DarchetypeArtifactIdには、Mavenが提供するプロジェクトのひな形(テンプレート)の中から、「クイックスタート」という基本的なJavaプロジェクトのひな形を指定しています。-DinteractiveMode=falseは、プロジェクト作成時にMavenから質問される対話形式をオフにして、自動でプロジェクトを作成するための設定です。
Jsoupをインストール
次に、作成したプロジェクトでJsoupライブラリを使えるように「インストール」します。Javaのプロジェクトにライブラリをインストールするとは、そのライブラリをプロジェクトの設定ファイルに記述し、利用可能にするという意味です。
作成したプロジェクトフォルダ内のpom.xmlというファイルを開きます。このpom.xmlは、Mavenプロジェクトの各種設定が記述されている重要なファイルです。
pom.xmlの<dependencies>というタグの中に、Jsoupライブラリの情報を追加します。<dependencies>タグは、このプロジェクトがどの外部ライブラリに依存しているか(使っているか)を記述する場所です。
Jsoupのバージョン情報は、Maven RepositoryというWebサイトで確認できます。このサイトでは、様々なJavaライブラリの最新バージョンや利用方法が公開されています。 Maven Repository:https://mvnrepository.com/artifact/org.jsoup/jsoup
以下のXMLコードをpom.xmlの<project>タグ内、かつ既存の<dependencies>タグが存在する場合はその中に、存在しない場合は<dependencies>タグごと追加してください。
1<dependency> 2 <groupId>org.jsoup</groupId> 3 <artifactId>jsoup</artifactId> 4 <version>1.18.2</version> 5</dependency>
<groupId>と<artifactId>はライブラリを特定するためのID、<version>は使用するライブラリのバージョンを示しています。
ビルド設定をする
次に、コマンドラインから作成したJavaプロジェクトのメインクラス(プログラムの実行開始地点となるクラス)を直接実行できるように、pom.xmlにbuildの設定を追加します。これは、Mavenを使ってJavaプログラムを実行するための準備です。
以下のXMLコードをpom.xmlの<project>タグ内に、既存の<build>タグが存在しない場合は<build>タグごと追加してください。
1<build> 2 <plugins> 3 <plugin> 4 <groupId>org.codehaus.mojo</groupId> 5 <artifactId>exec-maven-plugin</artifactId> 6 <version>3.1.0</version> 7 <configuration> 8 <mainClass>com.example.App</mainClass> 9 </configuration> 10 </plugin> 11 </plugins> 12</build>
この設定では、exec-maven-pluginというプラグイン(Mavenの機能を拡張するもの)を利用します。このプラグインは、JavaのプログラムをMaven経由で実行できるようにしてくれます。
<configuration>タグの中にある<mainClass>には、実行したいクラスの完全な名前(パッケージ名を含む)を指定します。ここでは、デフォルトで作成されるAppクラスを指しています。
設定ができたら、コマンドプロンプトやターミナルで、作成したプロジェクトのフォルダ(例: google-scraper)に移動します。
1cd google-scraper
次に、プロジェクトをビルドします。ビルドとは、Javaのソースコードをコンピュータが理解して実行できる形式に変換する作業のことです。
1mvn clean install
mvn clean installコマンドは、これまでのビルド結果を一度削除し(clean)、その後、プロジェクトのコンパイルや、必要なライブラリのダウンロード、JARファイルの作成などを行います(install)。
ビルドが成功したら、以下のコマンドでメインクラスを実行してみましょう。
1mvn exec:java -Dexec.mainClass="com.example.App"
このコマンドを実行すると、com.example.Appクラスが実行されます。デフォルトのApp.javaファイルには「Hello World!」と表示されるプログラムが書かれています。
もし「Hello World!」がコンソールに表示されれば、Mavenプロジェクトの作成、Jsoupの依存関係追加、ビルド設定がすべて成功していることを確認できます。
JavaのJsoupでスクレイピングする
この章では、JavaのJsoupライブラリを使ってウェブサイトから情報を取得する「スクレイピング」について学習します。スクレイピングとは、ウェブページの内容をプログラムで自動的に収集・抽出する技術のことです。Jsoupは、JavaでHTMLドキュメントを簡単に解析し、必要な情報を取り出すための便利なツールとして利用できます。
スクレイピングのサンプルコード
それでは、JavaのJsoupを使ったスクレイピングのサンプルコードを解説していきます。
下記のコードは、Jsoupを使用して「Javaとは」というキーワードでGoogle検索を行い、その検索結果ページから、各検索結果のタイトルとURLの一覧を取得するものです。
1package com.example; 2 3import org.jsoup.Jsoup; 4import org.jsoup.nodes.Document; 5import org.jsoup.nodes.Element; 6import org.jsoup.select.Elements; 7 8import java.net.URLEncoder; 9import java.nio.charset.StandardCharsets; 10 11public class App { 12 public static void main(String[] args) { 13 // 検索キーワード 14 String keyword = "Javaとは"; 15 16 try { 17 // キーワードをエンコードする 18 String encodedKeyword = URLEncoder.encode(keyword, StandardCharsets.UTF_8.name()); 19 20 // Google検索URLを構築 21 String url = "https://www.google.com/search?q=" + encodedKeyword; 22 23 // JsoupでHTMLを取得 24 Document document = Jsoup.connect(url).get(); 25 26 // h3要素を持つ結果を検索 27 Elements results = document.select("h3"); 28 29 for (Element result : results) { 30 // h3タグのタイトルを取得 31 String title = result.text(); 32 33 // h3タグの親(<a>要素)を取得 34 Element parentAnchor = result.parent(); 35 36 // 親要素からURLを取得 37 String href = parentAnchor.attr("href"); 38 39 System.out.println("タイトル: " + title); 40 System.out.println("URL: " + href); 41 System.out.println(); 42 } 43 } catch (Exception e) { 44 e.printStackTrace(); 45 } 46 } 47}
作成したファイルは、以下のコマンドでビルドして実行できます。
mvnコマンドは、Javaプロジェクトの管理やビルドを行うためのツールであるMavenを使用しています。
1mvn clean install 2mvn exec:java -Dexec.mainClass="com.example.App"
クラスをインポートする
まず、プログラムでJsoupの機能やJavaの標準機能を利用するために、必要なクラスをインポート(読み込み)します。これにより、インポートしたクラスが提供するメソッドやオブジェクトをコード内で使えるようになります。
1import org.jsoup.Jsoup; 2import org.jsoup.nodes.Document; 3import org.jsoup.nodes.Element; 4import org.jsoup.select.Elements; 5 6import java.net.URLEncoder; 7import java.nio.charset.StandardCharsets;
それぞれのクラスには以下の役割があります。
Jsoup:指定されたURLにHTTPリクエストを送信してHTMLを取得したり、取得したHTMLを解析したりする主要な機能を提供します。Document:Jsoupが解析したHTMLドキュメント全体を表すオブジェクトです。ウェブページの構造をまるごと保持しています。Element、Elements:HTMLドキュメントの中から特定の条件に合う要素(例:<p>タグ、<a>タグなど)を一つ(Element)または複数(Elements)で扱うためのクラスです。URLEncoder、StandardCharsets:検索キーワードのような日本語の文字列を、URLとして正しく扱える形式に変換(URLエンコード)するために使用する、Javaが標準で提供しているクラスです。
検索キーワードをエンコードする
次に、Googleで検索するキーワードをURLエンコードします。
1String keyword = "Javaとは"; 2 3String encodedKeyword = URLEncoder.encode(keyword, StandardCharsets.UTF_8.name());
Googleの検索結果ページのURLを見ると、検索キーワードはURLの一部として渡されています。例えば、「Javaとは」で検索すると、URLの一部にq=%E3%80%8CJav...のような文字列が含まれています。これは、日本語のような特殊な文字はそのままURLに含めることができず、%と16進数で表現される形式に変換する必要があるためです。この変換処理を「URLエンコード」と呼びます。
ここでは、URLEncoder.encodeメソッドを使って、検索キーワードである「Javaとは」という文字列を、文字コード「UTF-8」でURLエンコードしています。これにより、URLとして安全に扱える形式に変換されます。
検索URLを作成してHTMLを取得する
次に、エンコードしたキーワードを使ってGoogle検索結果ページのURLを作成し、そのURLからウェブページのHTMLコンテンツを取得します。
1String url = "https://www.google.com/search?q=" + encodedKeyword; 2 3Document document = Jsoup.connect(url).get();
Googleの検索結果ページのURLは、基本的にhttps://www.google.com/search?q=の後に検索キーワードが続く形式になっています。そのため、先ほどエンコードしたキーワード(encodedKeyword)を連結して完全な検索URLを構築しています。
Jsoup.connect(url)は、指定したURLに対してネットワーク接続を確立する準備をします。そして、.get()メソッドを呼び出すことで、実際にそのURLにアクセスし、ウェブページ全体のHTMLコンテンツをダウンロードします。ダウンロードされたHTMLはDocumentオブジェクトとして返され、このdocumentオブジェクトを通じてページの構造や内容にアクセスできるようになります。
タイトルを取得する
次に、取得したHTMLドキュメントの中から、検索結果のタイトルにあたる部分を取得します。
1Elements results = document.select("h3"); 2 3for (Element result : results) { 4 String title = result.text();
ウェブページのHTML構造を確認するには、ブラウザの開発者ツール(Chromeの場合はF12キーで開くことが多いです)を使用すると便利です。Googleの検索結果ページでタイトルがどのように表示されているか確認すると、通常は<h3>タグ(見出しレベル3)で設定されていることが分かります。
document.select("h3")は、取得したHTMLドキュメント(document)の中から、CSSセレクタ「h3」に一致するすべての要素を検索し、それらをElementsオブジェクトとして取得します。Elementsは複数のElement(要素)をまとめたコレクションです。
forループを使って、取得したresults(複数のh3要素)を一つずつ取り出し、それぞれのElement(result)に対して.text()メソッドを呼び出しています。.text()メソッドは、そのHTML要素に含まれるテキストコンテンツ(タグを除いた純粋な文字列)を取得する役割があります。これにより、検索結果のタイトル文字列だけを取得できます。
親要素からURLを取得する
最後に、取得したタイトル要素の親要素から、対応する検索結果のURLを取得して出力します。
1Element parentAnchor = result.parent(); 2 3String href = parentAnchor.attr("href"); 4 5System.out.println("タイトル: " + title); 6System.out.println("URL: " + href); 7System.out.println();
Google検索結果のHTML構造では、通常、タイトルを表す<h3>タグが、リンク(URL)を表す<a>タグの中に配置されています。つまり、<a>タグが<h3>タグの「親」にあたります。
result.parent()は、現在のElement(ここではh3タグ)の直接の親要素を取得します。この場合、親は<a>タグ(アンカータグ)になります。取得した親要素をparentAnchorというElement型変数に代入しています。
parentAnchor.attr("href")は、parentAnchor(<a>タグ)のhref属性の値を取得します。href属性には、そのリンクが指し示すURLが格納されています。このようにして、検索結果のURLを取得することができます。
取得したタイトルとURLは、System.out.printlnメソッドを使って、それぞれコンソール画面に出力しています。空行も出力することで、各検索結果が見やすく表示されるようにしています。
このコードを実行すると、ターミナルにGoogle検索「Javaとは」の結果から抽出されたタイトルとURLが一覧で表示されます。
おわりに
本記事では、JavaでWebスクレイピングを行うJsoupライブラリの基本的な使い方を習得しました。MavenプロジェクトのセットアップからJsoupの導入、URLエンコード、そしてWebページのHTML取得までの手順を実践しました。具体的には、CSSセレクタ「h3」を用いて検索結果のタイトルを抽出し、親要素のattr("href")メソッドで対応するURLを取得する方法を学びました。Jsoupは静的なWebページからの情報収集に特に有効ですが、JavaScriptで動的に変化するページにはSeleniumなどの別のライブラリが必要であることも理解できたでしょう。この記事を通じて、Webから情報を自動収集する技術の基礎をしっかりと身につけることができたと思います。