はじめに
今回からは、
ソースコードのダウンロード
今回作成するプログラムのソースコードは、
はてなブックマークのAPI
はてなブックマークには、
人気エントリーのRSSフィード
はてなブックマークには人気エントリーのページがありますが、
エントリー情報取得API
エントリー情報取得APIを使用すると、
今回のプログラムではまず、
ライブラリのダウンロード
RSSフィードやJSON形式のデータをJavaから扱う場合は、
ROME FetcherとJSON-libは以下のライブラリに依存しており、
- ROME Fetcherの依存ライブラリ
- JSON-libの依存ライブラリ
各プロジェクトサイトからバイナリファイルをダウンロードして展開し、
- commons-beanutils-1.
8.0. jar - commons-collections-3.
2.1. jar - commons-io-1.
4.jar - commons-lang-2.
4.jar - commons-logging-1.
1.1. jar - ezmorph-1.
0.5. jar - jdom.
jar - json-lib-2.
2.2-jdk15. jar - rome-1.
0RC1. jar - rome-fetcher-0.
9.jar
人気エントリーの取得
それではまず、
public class Bookmark {
public String url; // ブックマーク対象のURL
public String title; // ブックマークタイトル
}
次に、
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;
}
}
コードを簡単にするため、
エントリーの詳細情報の取得
人気エントリーのRSSフィードは、
public class BookmarkDetail {
public int bookmarkCount; // ブックマーク数
public List<String> tags; // ブックマークに付与されたタグの一覧
}
そして、
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;
}
はてなブックマークAPIの動作確認
ではここで、
public class Demo {
public static void main(String[] args) {
HatenaBookmarkAPI api = new HatenaBookmarkAPI();
List<Bookmark> bookmarks = api.getHotEntries();
System.out.println(bookmarks.size() + " entries.");
for (Bookmark bookmark : bookmarks) {
System.out.println(bookmark.title);
System.out.println(" [url] " + bookmark.url);
try {
// サーバの負荷を抑えるため呼び出し間隔を空ける
Thread.sleep(1000);
} catch (InterruptedException e) {
}
BookmarkDetail detail = api.getDetail(bookmark.url);
if (detail != null) {
System.out.println(" [bookmarkCount] " + detail.bookmarkCount);
System.out.println(" [tags] " + detail.tags);
}
}
}
}
Demoクラスを実行すると、
50 entries. 任天堂DS、年内に新型機 カメラ・音楽再生機能追加 - NIKKEI NET(日経ネット) [url] http://www.nikkei.co.jp/news/main/20080928AT1D2701J27092008.html [bookmarkCount] 192 [tags] [ニンテンドーDS, 日本経済新聞, ゲーム, ゲーム, game, ds, news, nintendo, ゲーム, ... [内輪]「あたし彼女」現代語訳 - 藤棚の上 [url] http://d.hatena.ne.jp/konaken/20080927/1222520200 [bookmarkCount] 252 [tags] [ケータイ小説, これはすごい, これはすごい, まとめ, 小説, あたし彼女, あとで読む, ケータイ小説, ... ウォールストリート日記 : ウォールストリートの歴史的1ヶ月 [url] http://wallstny.exblog.jp/8669144/ [bookmarkCount] 124 [tags] [金融, あとで読む, business, サブプライム, あとで読む, まとめ, 米国, 経済, 金融, 経済, ... ...
[tags]の内容に注目してください。
タグと出現回数のセットをベクトル形式で表現できれば、
次回に続く
今回は、