HTTP通信でHTML文書を取ってくる
普段インターネットを使うときはブラウザを用いると思いますが,自分で書いたプログラムからネットワーク上に存在するファイルを取得することができます.ブラウザがあるのにわざわざ自分でプログラムを書いてネットワークの通信をする必要があるかと思われるかもしれません.しかし,複数のファイルを自動的にダウンロードしたい場合などブラウザを使うよりも時間短縮につながるようなプログラムを書くことができます.今回はそういったプログラムは紹介しませんが,プログラムを使ったネットワーク通信の基本的なものの1つとしてJavaでHTTP通信をするプログラムの一例を紹介したいと思います.
JavaでHTTP通信
私がJavaでHTTP通信をするためのプログラムを書くとき,必ずといっていいほどネットで調べてからじゃないと書けないです.覚えてしまえば調べる時間を節約できるのですが,覚えるのはかなりしんどいので何らかのサンプルプログラムをみながら書くしかないです.ということで,JavaでHTTP通信をする大まかな流れを次に示します
import java.io.IOException; import java.net.HttpURLConnection; import java.net.URL; import java.io.InputStream; import java.io.InputStreamReader; import java.io.BufferedReader; import java.lang.StringBuilder; public class HttpSample { public static void main(String[] args) { String urlStr = “http://www.example.com”; String mode = "GET"; StringBuilder output = new StringBuilder(); HttpURLConnection urlConn = null; InputStream in = null; BufferedReader reader = null; try { URL url = new URL(urlStr); urlConn = (HttpURLConnection) url.openConnection(); urlConn.setRequestMethod(mode); urlConn.connect(); int status = urlConn.getResponseCode(); output.append("HTTPステータス: " + status + "\n\n"); if (status == HttpURLConnection.HTTP_OK) { in = urlConn.getInputStream(); reader = new BufferedReader(new InputStreamReader(in)); String line; while ((line = reader.readLine()) != null) { output.append(line + "\n"); } } } catch (IOException e) { e.printStackTrace(); } finally { try { if (reader != null) { reader.close(); } if (urlConn != null) { urlConn.disconnect(); } } catch (IOException e) { e.printStackTrace(); } } System.out.println(output.toString()); } }
実行結果は次のようになります.
$ java HttpSample HTTPステータス: 200 <!doctype html> <html> <head> <title>Example Domain</title> <meta charset="utf-8" /> <meta http-equiv="Content-type" content="text/html; charset=utf-8" /> <meta name="viewport" content="width=device-width, initial-scale=1" /> <style type="text/css"> body { background-color: #f0f0f2; ...
このプログラムは変数urlStrに入れたURLのサイトと通信してHTTPステータスとHTML文書を表示するというものです.例外処理などで行数が少し大きくなっていますが,処理の流れとしては, 指定したURLの通信を確立 取得したHTML文書を入力ストリームに流す 入力ストリームによって得たHTML文書を画面表示 という感じになっています.この流れさえ使えるようになれば,あとは応用して色々なWebページからHTML文書を取ってきて,そのHTML文書を加工するなど色々な用途に使えるようになります.
データを集める技術 最速で作るスクレイピング&クローラー [ 佐々木 拓郎 ] 価格:2,592円 |
HTML文書の加工例
HTML文書には色々な文章やリンク,種類によっては何らかの値が書かれています.例えば,jpeg形式の画像ファイルのリンクを抽出したい場合はunixのコマンドで
grep -o '"[^\"]*jpg"' HTMLファイル
と打てば持って来れます.今回はunixコマンドでHTML文書の加工方法の簡単な例を示しましたが,何らかの言語でプログラムを作りより細かい処理をすることができます.よく使うのが正規表現で,HTML文書の特定の部分から所望のデータを取ってくるために使われます.他にXMLパーサもよく用いられます.今回の記事では書きませんが,HTML文書からのデータ抽出例を他の記事で書いていきたいと思います.
終わりに
今回はJavaでのHTTP通信について説明しました.どうしても行数が増えてしまいますが,やっていることはあまり難しくないので萎縮する必要はありません.覚えるのは難しいので自分のPCのどっかにサンプルファイルを置いておき,必要があればちらっと見るようにすればいいのではないかと思います.今回は1つの例しか書きませんでしたが,「HTML文書を取ってくる」という部分は色々な場面で使われるので重要です. HTML文書の加工例も1つ出しました.HTML文書からデータを抽出するという処理は,機械学習やデータマイニングなど現在のトレンドとなっている技術で使われているので使えるようになっておけば損はありません.自分も練習してこのブログで色々な例を出していければと思います.