Java Network 〜HTMLからデータ取得1〜

今回は、HTMLからのデータ取得を行う処理を実装しようと思います。

HTMLからデータ取得

HTMLからデータを取得する、つまりインターネットにアクセスして特定のウェブページを見る(閲覧)などして自分らが必要な情報を取得する、ということをプログラムにやらせようという分けです。

前提として、プログラム(PC)は人間ほど柔軟な思考ができるわけでもなく、我々人間が指示(プログラム)した通りにしか動いてくれません。なので一工夫が必要になります。

最近では、人工知能なんてものもありますので、この分野は広く開拓できそうです。俗に言う「自然言語解析」と言うやつです。
初めから複雑なことはできないので、1つずつ段階的に実装していきます。

データ取得Lv1

データの取得、HTMLを取得するという部分を実装します。
結論からいうと下のようなコードになります。

// ⑴ URLを指定する
String targetUrl = "https://ja.wikipedia.org/wiki/%E6%AD%A6%E5%99%A8";
// ⑵取得したHTMLをオブジェクトにするためのクラス
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
DocumentBuilder builder = null;
try {
    builder = factory.newDocumentBuilder();
} catch (ParserConfigurationException e1) {
    // TODO Auto-generated catch block
    e1.printStackTrace();
}
// ⑶ 指定したURLにアクセス、HTMLの取得
try {
    URL urlCls = new URL(targetUrl);
    urlCls.openConnection();
    InputStream inp = (InputStream) urlCls.getContent();
    Document html = builder.parse(inp);
} catch(MalformedURLException e) {
    e.printStackTrace();
} catch(IOException ie) {
    ie.printStackTrace();
} catch (SAXException e) {
    e.printStackTrace();
}


ここで使用しているクラスはJDKに入っているもので「〜.jar」をダウンロードとかしなくても使用できるコードになります。
処理の内容としては、以下の通りになります。

⑴ URLを指定する

これは、説明するまでもないような気もしますが、ポイントになるので。。。
文字列の変数「targetUrl」に、アクセスするURLを設定します。
現状のコードでは、固定値になりますが、今後この部分を引数に変更して動的なURLにアクセスできるように変更します。

⑵取得したHTMLをオブジェクトにするためのクラス

Documentクラスを使用して取得したHTMLから必要な情報を取得します。

DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();

実際にHTMLの文字列を取得することもできますが、取得したいデータは、記載されている内容なので、タグの部分は無視したいためこのような方法を使いました。
ちなみに、これ(Documentクラス)も余計な情報をふんだんに持っているので、今後はJsoupを使用して実装する予定です。これを使うにはリンク先のJARファイルをダウンロード、ビルドパスに設定という手順を踏む必要があります。→この部分に関してはこちらの記事を参照ください。この記事ではJSONライブラリ(json-path-2.1.0.jar)を追加しています。下のような記事です。

⑶ 指定したURLにアクセス、HTMLの取得

ここまできたら、あとはメソッドを呼び出すだけです。
ちょっと注意が必要なのはURL#getContent()の返り値がObujectなので「何でも返す」というところです。当然本当はStringを返しているのにFileで受け取ろうとすればExceptionがでます。このメソッドの用途を明確にして取得するもの(HTMLやイメージファイルなど)をはっきりさせて実装する必要があります。

まとめ

今回は、HTMLを取得するのに以下のクラスを使用してやりました。

  1. URLクラス: インターネット上のコンテンツ(HTMLなど)にアクセスする
  2. Documentクラス: 取得したコンテンツをドキュメント(HTMLやXML)として扱う ※同じ名前で違う機能のものがあるので注意が必要です。
  3. [InputStream](): 読み込み用、入力ストリームです。この「ストリーム」に関してはこちらの記事を参照ください。クラスの実装例でInputStreamを使用しています。
  4. DocumentBuilderFactory: DocumentBuilderクラスを取得するためのクラスです。
  5. DocumentBuilder: Documentクラスを取得するためのクラスです。

これらのクラスを使用して、インターネット上のHTMLファイルを読み込み、コンテンツ(HTML文書)を取得、までの実装になります。こちらのGitにあるソースは、文書の読み込みも実装しています。

目的の確認

HTMLをダウンロードしてその中身を解析することが目的なのでこの方法では、HTMLを取得するのに結構な手間がかかります。なのでフレームワークの利用を検討します。

次回は読み込み部分の処理について記載したいと思います。

でわでわ。。。



投稿者:

takunoji

音響、イベント会場設営業界からIT業界へ転身。現在はJava屋としてサラリーマンをやっている。自称ガテン系プログラマー(笑) Javaプログラミングを布教したい、ラスパイとJavaの相性が良いことに気が付く。 Spring framework, Struts, Seaser, Hibernate, Playframework, JavaEE6, JavaEE7などの現場経験あり。 SQL, VBA, PL/SQL, コマンドプロント, Shellなどもやります。

コメントを残す