はてなブックマークのお気に入り関連をゴニョゴニョといじくる。

出力結果

これなあに?

はてなブックマークでは、他のユーザーを「お気に入り」として 自分のリストに追加可能です。お気に入りに入れると、http://b.hatena.na.jp/[user]/favorite にそのユーザー一覧が表示されます。お気に入りに入れられたユーザーは、誰が自分のことをお気に入りに入れたかすぐにはわかりませんが、お気に入りに入れられた数は知ることが出来ます。

お気に入りに入れてくれたユーザーを知ることは出来ないので、「知りたい」という要望がでることはよくあるのですが、あまりその辺を密接に繋げることはしたくない、というのがはてな側の考えのようで、これは実装の予定がありません。一方で、お気に入りリストが公開されているので、それを使って間接的にお気に入りに入れてくれるユーザー(お気に入られ)を知る方法が生み出されてきました。

お気に入られを知る方法で一番有名なのが、googleでb.hatena.ne.jpを対象に(site:b.hatena.ne.jp)、「お気に入り」という言葉がtitleに含まれる(intitle:お気に入り)サイトを検索して、さらにその中にユーザー名が入っているどうかで絞り込む方法。これだとだいたい半分くらいのユーザーが把握できます。

せっかくお気に入りの一覧が(公開ユーザーなら)表示されているんだから、それをクロールしてくればいいじゃん、という感じで作ったのが冒頭のリストです。人にもよりますが、7割くらいのユーザーはこれで把握できる感じです。

もちろん、公開データのみを使って作業していますので、プライベートモードになっているユーザーは把握出来ません。

どうやって作ってるの?

下に置いてある「出力を作るperl script」を使っています。いくつかモジュールを使っていますがperlを読める人なら何のモジュールを使っているかはわかるでしょう。

  1. まず、"ある人のお気に入り"ページを取得します。(一番最初は初期ユーザーとして与えてあげます)。
  2. その人のお気に入り一覧(<div class="favoritelist">タグで囲まれている部分)を探します。
  3. その中のテキストのうち、user名っぽいものをユーザーとみなします。(今ならaタグのリンク先とか使っても良いかもしれませんが、どっちにせよ今のところ精度はそれほど変わりません)
  4. 各ユーザーにつき、今取得したページのユーザーを"お気にいられ"ユーザーとして追加します。
  5. 各ユーザーが初めての人なら、処理待ちリストに加えます。
  6. 処理待ちリストから、次のユーザーを取得します。
  7. 最初に戻ります。

初期ユーザーを誰にするかで結果が変わるか、いろいろ取得して調べたんですが、まあだいたい20人くらいお気に入られている人であれば誰を最初にしても結果は同じみたいです。つまり、そこから最終的にたどれないにも関わらず、お気にいられ数(被fav数)が20以上になっている人はいなかった、というのが自分の調査結果でした。今はとりあえず"kanose"を初期ユーザーにしています。

いつやってるの?

今は、毎月1日の午前2時半からcronを回しています。数時間で取得が終わっているのに後で気が付いて、その数時間後〜数日後にここにアップする感じです。

どうやって読むの?

YAMLで保存されてます。YAMLの説明は要る? まあいいや、省略しちゃいます。いろんなスクリプト言語で読めるようになってます。まあ、:区切りでデータ置いたり、-列挙でリスト作ってるだけなので、人間でもよもうと思えば読めるんじゃないでしょうか? ちなみに、

こんな感じになっています。

あと、2007年7月1日以降のデータには「被favWiki」で使える被favランキングデータも同梱してあります。(この説明でわかる方、誰か書き換えて頂ければ幸いです)

また、2008年5月1日以降2009年2月1日までのデータには、JSON形式で保存したデータも同梱しました。JSON::Syck::Dumpでただ出力しただけのやつですが……

この出力を作るために使ったツール

関連分析してみたりする。

このリストを使ったり使わなかったりしていろいろ調べたことがあります。

ブックマークレット

showRetired

	var d=document;
	var url='http://kadete.info/hatenabookmark/jquery-1.3.2.min.js';
	var e=d.createElement('script');
	e.charset='utf-8';
	e.src=url;
	d.getElementsByTagName('head')[0].appendChild(e);

	url='http://kadete.info/hatenabookmark/showRetired.js';
	if(!url.match(/\?/))url+='?t='+(new Date()).getTime();
	var e2=d.createElement('script');
	e2.charset='utf-8';
	e2.src=url;
	d.getElementsByTagName('head')[0].appendChild(e2);
これが何をするかとか、どう使うかとかははてなダイアリーにて

もっと古いやつ

最初はデータ構造が違う形で作ってました。これについての説明は省略します。