今回は、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を取得するのに以下のクラスを使用してやりました。
- URLクラス: インターネット上のコンテンツ(HTMLなど)にアクセスする
- Documentクラス: 取得したコンテンツをドキュメント(HTMLやXML)として扱う ※同じ名前で違う機能のものがあるので注意が必要です。
- [InputStream](): 読み込み用、入力ストリームです。この「ストリーム」に関してはこちらの記事を参照ください。クラスの実装例でInputStreamを使用しています。
- DocumentBuilderFactory: DocumentBuilderクラスを取得するためのクラスです。
- DocumentBuilder: Documentクラスを取得するためのクラスです。
これらのクラスを使用して、インターネット上のHTMLファイルを読み込み、コンテンツ(HTML文書)を取得、までの実装になります。こちらのGitにあるソースは、文書の読み込みも実装しています。
目的の確認
HTMLをダウンロードしてその中身を解析することが目的なのでこの方法では、HTMLを取得するのに結構な手間がかかります。なのでフレームワークの利用を検討します。
次回は読み込み部分の処理について記載したいと思います。
でわでわ。。。