具体例で学ぶ!情報可視化のテクニック

第5回 はてなブックマークの可視化(前編)

この記事を読むのに必要な時間:およそ 4 分

人気エントリーの取得

それではまず,はてなブックマークの人気エントリーのRSSフィードを読み込むプログラムを作成しましょう。先に,エントリー情報を格納する以下のBookmarkクラスを用意します。

リスト1 Bookmark.java

public class Bookmark {
   public String url; // ブックマーク対象のURL
   public String title; // ブックマークタイトル
}

次に,HatenaBookmarkAPIクラスを作成します。このクラスには,人気エントリーの一覧をBookmarkオブジェクトのリストとして返すgetHotEntries()メソッドを持たせます。

リスト2 HatenaBookmarkAPI.java(部分)

public class HatenaBookmarkAPI {
   public List<Bookmark> getHotEntries() {
      List<Bookmark> bookmarks = new ArrayList<Bookmark>();
      FeedFetcher fetcher = new HttpURLFeedFetcher();
      SyndFeed feed;
      try {
         // 人気エントリーのRSSフィードを読み込む
         feed = fetcher.retrieveFeed(new URL(
               "http://b.hatena.ne.jp/hotentry?mode=rss"));
      } catch (Exception e) {
         return bookmarks;
      }
      // 各エントリーの情報を取得
      for (Object e : feed.getEntries()) {
         SyndEntry entry = (SyndEntry) e;
         Bookmark bookmark = new Bookmark();
         bookmark.url = entry.getLink();
         bookmark.title = entry.getTitle();
         bookmarks.add(bookmark);
      }
      return bookmarks;
   }
}

コードを簡単にするため,URLへのアクセス時にエラーが発生した場合は,特にエラー処理を行わずに空のリストを返しています。

エントリーの詳細情報の取得

人気エントリーのRSSフィードは,各エントリーのURLやタイトルといった見出しレベルの情報しか含んでいません。ブックマーク数やタグなどの詳細情報を得るためには,エントリー情報取得APIを個別に呼び出す必要があります。この詳細情報を格納する目的で,BookmarkDetailクラスを定義します。

リスト3 BookmarkDetail.java

public class BookmarkDetail {
   public int bookmarkCount; // ブックマーク数
   public List<String> tags; // ブックマークに付与されたタグの一覧
}

そして,HatenaBookmarkAPIクラスに,特定のURLからブックマークエントリーの詳細情報を取得するgetDetail()メソッドを追加します。こちらもエラー処理を省略し,URLの読み込みに失敗した場合には単にnullを返すこととします。

リスト4 HatenaBookmarkAPI.java(部分)

public BookmarkDetail getDetail(String url) {
   String encodedUrl;
      try {
        // URLをUTF-8でエンコードする
        encodedUrl = URLEncoder.encode(url, "UTF-8");
      } catch (UnsupportedEncodingException e) {
          throw new InternalError();
      }
        // エントリー情報取得APIのURL
        String apiUrl = "http://b.hatena.ne.jp/entry/json/?url=" +  encodedUrl;
      InputStream in = null;
      String data;
      try {
         // URLを開き,データを読み込む
         in = new URL(apiUrl).openStream();
         data = IOUtils.toString(in);
      } catch (Exception e) {
         return null;
      } finally {
         IOUtils.closeQuietly(in);
      }
      // 戻り値が()で囲まれている場合,JSON-libで読み込めないので取り除く
      if (data.startsWith("(") && data.endsWith(")")) {
         data = data.substring(1, data.length() - 1);
      }
      // データをJSONとして読み込む
      JSONObject json = JSONObject.fromObject(data);

      // 詳細情報を作成
      BookmarkDetail detail = new BookmarkDetail();
      detail.bookmarkCount = (int) json.getLong("count");
      detail.tags = new ArrayList<String>();

      // bookmarks配列を読み込む
      JSONArray bookmarks = json.getJSONArray("bookmarks");
      for (int i = 0; i < bookmarks.size(); i++) {
         JSONObject item = bookmarks.getJSONObject(i);
         // tags配列を読み込む
         JSONArray tags = item.getJSONArray("tags");
         for (int j = 0; j < tags.size(); j++) {
            detail.tags.add(tags.getString(j));
         }
      }

      return detail;
   }

著者プロフィール

浜本階生(はまもとかいせい)

1981年生まれ。栃木県出身。東京工業大学情報工学科卒業。技術やアイデアの組み合わせから面白いソフトウェアを生み出したいと日々考えている。現在,ブログの解析および視覚化の試みとして「TopHatenar」「Blogopolis」を開発,運用中。

URLhttp://d.hatena.ne.jp/kaiseh/