Bookmark::URITrace

github::clown::ruby-hatena のコメントでも指摘されていますが,以前作成したライブラリがはてなブックマークのリニューアルで機能しなくなっていたようです.やはり,html から無理やり情報を抜き出す方法は抜き出される側の変更の影響を強く受けやすいですね.とは言いつつも,配信されている RSS なども限られているので引き続き html から無理やり抜き出す方向で頑張ってみます.

修正にあたって最も変更を加えたのが Hatena::Bookmark::URITrace*1 なので,ここでは URITrace の実装方針について少し触れておきます.URITrace を修正する上で問題になったのが,今までの単純に末尾に &of=XX を加えるだけではうまくいかない場合が多くなった事です.以前は XX の数字が適当でも期待した結果を返してくれた(ように記憶している)のですが,リニューアル後は,例えば各ユーザのブックマークページの場合,XX の値が 0--50 の場合は of=0 として,51--100 の場合は of=50 として結果が返されてしまうようで,なかなか期待した結果が得られなくなりました.

そこで,どうしようかと思案しながら html を眺めているうちに目に止まったのが next の情報.例えば,b:id:tt_clown の html を見ると以下のような next が指定されています.

<link rel="next" href="?of=50" title="次のページ" />

これが,http://b.hatena.ne.jp/tt_clown/?of=50 では以下の通り.

<link rel="next" href="?of=100" title="次のページ" />

そして,最後のページまでたどり着く(上記の例では,http://b.hatena.ne.jp/tt_clown/?of=3000)と next の情報が消えます.なので,html を取得して next を追い続けていけば URITrace を実現することができそうです.

はてなブックマークの next 情報は結構頑張って作られていて,例えば,http://b.hatena.ne.jp/tt_clown/favorite?threshold=4(お気に入りに登録している人のうち 4 人以上がブックマークしている URL 一覧)のように適当な URL を打ち込んでも以下のようにきちんとナビゲートしてくれます.

<link rel="next" href="/tt_clown/favorite?threshold=4&of=20" title="次のページ" />

なので,意外といろいろな形で指定したパスのページでブックマークされている URL の一覧を追うことができます.今のところ,各ユーザ ID,entrylist,hotentry,video,asin 辺りはテストして確認しました.また,日にち付きのパスを指定した場合は日にち単位で遡って追うことができるようです.例えば,http://b.hatena.ne.jp/hotentry/20081218 の場合は next は以下のように設定されています.

<link rel="next" href="/hotentry/20081217" title="次のページ" />

なので,URITrace は 20081217,20081216,... と言う感じで日にち単位で遡って URL を取得していきます.

作成したライブラリの簡単な説明とサンプルコードは,Hatena@Cielquis.Net でまとめてあります.また,この blog で書いたはてな関連の記事も一緒に一覧としてまとめてみました.blog はいろいろ話題が乱立してて追いにくいという人はそちらから.

*1:Trace と言う名前を変更しました.