Hatena::Groupnadesiko

そっとなでしこ RSSフィード


メインのブログに書くまでもない、なでしこ学習帳【記事一覧】 【このブログは何?】


特設!→【目次】なでしこ用Twitter 連携ライブラリ「なこったー」で遊ぶ


2010-07-01

「はてなブックマークユーザーが注目するYYYY年xx期アニメ」記事用スクリプト

| 「はてなブックマークユーザーが注目するYYYY年xx期アニメ」記事用スクリプト - そっとなでしこ を含むブックマーク はてなブックマーク - 「はてなブックマークユーザーが注目するYYYY年xx期アニメ」記事用スクリプト - そっとなでしこ

 以下の2つのスクリプトを統合し、とりあえず完成へ。

 使用するデータは、以前と手動で集計した時と同様に、マイコミジャーナルさんの記事からスクレイピングしたものを加工しました。

■ソースコード

#-----------------------------------------------------------------------
# 定数の定義/データの設定
#-----------------------------------------------------------------------
!API_URLは「http://b.hatena.ne.jp/xmlrpc」。

サイト群は「オオカミさんと七人の仲間たち,http://www.otogi-bank.com/
アマガミSS,http://www.tbs.co.jp/anime/amagami/
黒執事II,http://www.kuroshitsuji.tv/
伝説の勇者の伝説,http://www.denyuden.jp/
祝福のカンパネラ,http://www.mmv.co.jp/special/campanella/
みつどもえ,http://www.mitsudomoe-anime.com/
生徒会役員共,http://www.starchild.co.jp/special/seitokai/
セキレイ~Pure Engagement~,http://www.sekirei-tv.com/
学園黙示録 HIGHSCHOOL OF THE DEAD,http://www.geneonuniversal.jp/rondorobe/anime/hotd/
世紀末オカルト学院,http://www.occult-gakuin.jp/
ぬらりひょんの孫,http://www.nuramago.jp/
スティッチ!~ずっと最高のトモダチ~,http://www.disney.co.jp/character/stitch/okinawa/
デジモンクロスウォーズ,http://www.toei-anim.co.jp/tv/digimon_xw/
ストライクウィッチーズ2,http://s-witch.cute.or.jp/
屍鬼,http://www.okiagari.net/
あそびにいくヨ!,http://www.asoiku.com/
戦国BASARA弐,http://www.sengokubasara.tv/
モンハン日記ぎりぎりアイルー村☆アイルー危機一髪☆,http://www.capcom.co.jp/monsterhunter/pokapoka_airu/」。

エラーログは「」。
エラーカウンターは0。
出力結果は「」。
#-----------------------------------------------------------------------
# メイン処理
#-----------------------------------------------------------------------
サイト群を反復
  サイトデータは、それを「,」で区切る。
  合計数は、サイトデータ[1]から被ブックマーク合計数取得。
  取得結果は「{サイトデータ[0]},{サイトデータ[1]},{合計数}{改行}」。
  出力結果は、出力結果&取得結果。
  1秒待つ。
ここまで
ソート済出力結果は、出力結果から順位表出力。

「
-----------------------------------------------------------------------
{ソート済出力結果}
-----------------------------------------------------------------------
↓エラーログ↓
{エラーログ}
」をメモ記入。
母艦を閉じる。

#-----------------------------------------------------------------------
# 関数定義
#-----------------------------------------------------------------------
●被ブックマーク合計数取得(対象URLから)
  #対象URLを言う。
  パラメータXMLはパラメータ設定(対象URL)。
  メソッドXMLはメソッド設定(「bookmark.getTotalCount」、パラメータXML)。
  被ブックマーク合計数取得XMLは「
<?xml version="1.0"?>
{メソッドXML}」。
  ヘッダは「」。
  エラー監視
    結果は、ヘッダと被ブックマーク合計数取得XMLをAPI_URLへHTTPポスト。
    結果数値は、結果から「int」のタグ切り出してタグ削除。
  エラーならば
    1秒待つ。
    エラーカウンターに1を直接足す。
    エラーログは、エラーログ&「{対象URL}|{エラーカウンター}{改行}」。
    もし、(エラーカウンター<6)ならば
      結果数値は、対象URLから被ブックマーク合計数取得。
    違えば
      結果数値は-1。
  エラーカウンターは0。
  結果数値で戻る。

●パラメータ設定(パラメータ値)
  それは「<param><value><string>{パラメータ値}</string></value></param>」。
  それで戻る。
●メソッド設定(メソッド名,パラメータ群)
  それは「<methodCall><methodName>{メソッド名}</methodName><params>
{パラメータ群}</params></methodCall>」。
  それで戻る。

●順位表出力(順位表リストから)
  順位表リストは、順位表リストの2を表数値ソート。
  出力順位表リストは「|*順位|*アニメタイトル|*被ブックマーク数|{改行}」。
  順位は0。
  前データ値は0。
  同順位数は1。
  回数で1から(順位表リストの表行数)まで繰り返す
    順位表リスト[(順位表リストの表行数)-回数]を「タイトル項,URL項,数値項」へ変数分配。
    もし、(数値項=前データ値)ならば
      同順位数に1を直接足す。
    違えば
      順位に同順位数を直接足す。
      同順位数は1。
    出力順位表リストは、出力順位表リスト&
    「|第{順位}位|<a href="{URL項}">{タイトル項}</a>|」&
    「({数値項})」&
    「<a href="http://b.hatena.ne.jp/entrylist?url={URL項}" target="_blank">」&
    「<img src="http://b.hatena.ne.jp/bc/or/{URL項}" class="bcounter"></a>|」&
    「{改行}」。
    前データ値は数値項。
  ここまで
  出力順位表リストで戻る。

■出力結果例

-----------------------------------------------------------------------
|*順位|*アニメタイトル|*被ブックマーク数|
|第1位|<a href="http://s-witch.cute.or.jp/">ストライクウィッチーズ2</a>|(135)<a href="http://b.hatena.ne.jp/entrylist?url=http://s-witch.cute.or.jp/" target="_blank"><img src="http://b.hatena.ne.jp/bc/or/http://s-witch.cute.or.jp/" class="bcounter"></a>|
|第2位|<a href="http://www.okiagari.net/">屍鬼</a>|(81)<a href="http://b.hatena.ne.jp/entrylist?url=http://www.okiagari.net/" target="_blank"><img src="http://b.hatena.ne.jp/bc/or/http://www.okiagari.net/" class="bcounter"></a>|
|第3位|<a href="http://www.mitsudomoe-anime.com/">みつどもえ</a>|(63)<a href="http://b.hatena.ne.jp/entrylist?url=http://www.mitsudomoe-anime.com/" target="_blank"><img src="http://b.hatena.ne.jp/bc/or/http://www.mitsudomoe-anime.com/" class="bcounter"></a>|
|第4位|<a href="http://www.sekirei-tv.com/">セキレイ~Pure Engagement~</a>|(38)<a href="http://b.hatena.ne.jp/entrylist?url=http://www.sekirei-tv.com/" target="_blank"><img src="http://b.hatena.ne.jp/bc/or/http://www.sekirei-tv.com/" class="bcounter"></a>|
|第5位|<a href="http://www.capcom.co.jp/monsterhunter/pokapoka_airu/">モンハン日記ぎりぎりアイルー村☆アイルー危機一髪☆</a>|(37)<a href="http://b.hatena.ne.jp/entrylist?url=http://www.capcom.co.jp/monsterhunter/pokapoka_airu/" target="_blank"><img src="http://b.hatena.ne.jp/bc/or/http://www.capcom.co.jp/monsterhunter/pokapoka_airu/" class="bcounter"></a>|
|第6位|<a href="http://www.sengokubasara.tv/">戦国BASARA弐</a>|(29)<a href="http://b.hatena.ne.jp/entrylist?url=http://www.sengokubasara.tv/" target="_blank"><img src="http://b.hatena.ne.jp/bc/or/http://www.sengokubasara.tv/" class="bcounter"></a>|
|第7位|<a href="http://www.kuroshitsuji.tv/">黒執事II</a>|(28)<a href="http://b.hatena.ne.jp/entrylist?url=http://www.kuroshitsuji.tv/" target="_blank"><img src="http://b.hatena.ne.jp/bc/or/http://www.kuroshitsuji.tv/" class="bcounter"></a>|
|第7位|<a href="http://www.occult-gakuin.jp/">世紀末オカルト学院</a>|(28)<a href="http://b.hatena.ne.jp/entrylist?url=http://www.occult-gakuin.jp/" target="_blank"><img src="http://b.hatena.ne.jp/bc/or/http://www.occult-gakuin.jp/" class="bcounter"></a>|
|第9位|<a href="http://www.otogi-bank.com/">オオカミさんと七人の仲間たち</a>|(25)<a href="http://b.hatena.ne.jp/entrylist?url=http://www.otogi-bank.com/" target="_blank"><img src="http://b.hatena.ne.jp/bc/or/http://www.otogi-bank.com/" class="bcounter"></a>|
|第10位|<a href="http://www.nuramago.jp/">ぬらりひょんの孫</a>|(23)<a href="http://b.hatena.ne.jp/entrylist?url=http://www.nuramago.jp/" target="_blank"><img src="http://b.hatena.ne.jp/bc/or/http://www.nuramago.jp/" class="bcounter"></a>|
|第11位|<a href="http://www.mmv.co.jp/special/campanella/">祝福のカンパネラ</a>|(22)<a href="http://b.hatena.ne.jp/entrylist?url=http://www.mmv.co.jp/special/campanella/" target="_blank"><img src="http://b.hatena.ne.jp/bc/or/http://www.mmv.co.jp/special/campanella/" class="bcounter"></a>|
|第12位|<a href="http://www.toei-anim.co.jp/tv/digimon_xw/">デジモンクロスウォーズ</a>|(20)<a href="http://b.hatena.ne.jp/entrylist?url=http://www.toei-anim.co.jp/tv/digimon_xw/" target="_blank"><img src="http://b.hatena.ne.jp/bc/or/http://www.toei-anim.co.jp/tv/digimon_xw/" class="bcounter"></a>|
|第13位|<a href="http://www.geneonuniversal.jp/rondorobe/anime/hotd/">学園黙示録 HIGHSCHOOL OF THE DEAD</a>|(19)<a href="http://b.hatena.ne.jp/entrylist?url=http://www.geneonuniversal.jp/rondorobe/anime/hotd/" target="_blank"><img src="http://b.hatena.ne.jp/bc/or/http://www.geneonuniversal.jp/rondorobe/anime/hotd/" class="bcounter"></a>|
|第14位|<a href="http://www.tbs.co.jp/anime/amagami/">アマガミSS</a>|(17)<a href="http://b.hatena.ne.jp/entrylist?url=http://www.tbs.co.jp/anime/amagami/" target="_blank"><img src="http://b.hatena.ne.jp/bc/or/http://www.tbs.co.jp/anime/amagami/" class="bcounter"></a>|
|第14位|<a href="http://www.denyuden.jp/">伝説の勇者の伝説</a>|(17)<a href="http://b.hatena.ne.jp/entrylist?url=http://www.denyuden.jp/" target="_blank"><img src="http://b.hatena.ne.jp/bc/or/http://www.denyuden.jp/" class="bcounter"></a>|
|第16位|<a href="http://www.asoiku.com/">あそびにいくヨ!</a>|(16)<a href="http://b.hatena.ne.jp/entrylist?url=http://www.asoiku.com/" target="_blank"><img src="http://b.hatena.ne.jp/bc/or/http://www.asoiku.com/" class="bcounter"></a>|
|第17位|<a href="http://www.starchild.co.jp/special/seitokai/">生徒会役員共</a>|(14)<a href="http://b.hatena.ne.jp/entrylist?url=http://www.starchild.co.jp/special/seitokai/" target="_blank"><img src="http://b.hatena.ne.jp/bc/or/http://www.starchild.co.jp/special/seitokai/" class="bcounter"></a>|
|第18位|<a href="http://www.disney.co.jp/character/stitch/okinawa/">スティッチ!~ずっと最高のトモダチ~</a>|(9)<a href="http://b.hatena.ne.jp/entrylist?url=http://www.disney.co.jp/character/stitch/okinawa/" target="_blank"><img src="http://b.hatena.ne.jp/bc/or/http://www.disney.co.jp/character/stitch/okinawa/" class="bcounter"></a>|

-----------------------------------------------------------------------
↓エラーログ↓
http://www.toei-anim.co.jp/tv/digimon_xw/|1
http://s-witch.cute.or.jp/|1
http://www.sengokubasara.tv/|1

出力された、はてな記法の表組みは、表示するとこんな感じ

順位アニメタイトル被ブックマーク数
第1位ストライクウィッチーズ2(135)
第2位屍鬼(81)
第3位みつどもえ(63)
第4位セキレイ~Pure Engagement~(38)
第5位モンハン日記ぎりぎりアイルー村☆アイルー危機一髪☆(37)
第6位戦国BASARA弐(29)
第7位黒執事II(28)
第7位世紀末オカルト学院(28)
第9位オオカミさんと七人の仲間たち(25)
第10位ぬらりひょんの孫(23)
第11位祝福のカンパネラ(22)
第12位デジモンクロスウォーズ(20)
第13位学園黙示録 HIGHSCHOOL OF THE DEAD(19)
第14位アマガミSS(17)
第14位伝説の勇者の伝説(17)
第16位あそびにいくヨ!(16)
第17位生徒会役員共(14)
第18位スティッチ!~ずっと最高のトモダチ~(9)

■スクリプトについてコメント

■被ブックマーク合計数取得関数内でのHTTPポストのエラー処理

 はてなブックマークのXML-RPC APIにHTTPポストする個所で、なでしこのHTTPポストがエラーになることがあります。上記スクリプトでは18回ポストするわけですが、大体、その内少なくとも1回はエラーになる感触です。

 HTTPポストをする間隔を空けて試してみたりもしました。

 1秒間隔から初めて、最大で5秒間隔空けて試してみたのですが、HTTPポストをする間隔とエラー発生率とは全く無関係のようでした。

 そこで、HTTPポストの個所にエラー監視を設置しました。

 そして、エラーが発生した場合は、被ブックマーク合計数取得を再帰呼び出しするようにしてみました。

 ただ、エラーが発生する限り無限に再帰してはマズイので、リトライは5回までと制限してみました。リトライ回数のカウンターは、関数の外で宣言した、スコープがグローバルな変数で保持しています。あまりスマートな方法では無いのかもしれませんが。

 エラーの発生状況も把握しておきたかったので、簡単なエラーログも吐かせています。自作のスクリプトで他所様のサーバに負荷をかけ続けると、警察に逮捕される怖いご時世ですしw

 自分が動かした範囲では、2回以上連続してエラーが発生することはめったにないようです。

■ブックマーク数の画像カウンター

 これを使っています。

<a href="http://b.hatena.ne.jp/entrylist?url=ブログのURL">
<img src="http://b.hatena.ne.jp/bc/色/ブログのURL" class="bcounter"></a>

■さらなる改良構想

 手作業で集計していた時に、やはりこれも手作業で行っていた、順位に応じた文字のサイズや色の設定も、上記のスクリプトに組み込んでも良いかも。順位と文字色、サイズの組み合わせは、ハッシュテーブルで指定するような感じで。




順位表作成スクリプト

| 順位表作成スクリプト - そっとなでしこ を含むブックマーク はてなブックマーク - 順位表作成スクリプト - そっとなでしこ

 次に、アニメ公式サイトの被はてなブックマーク数を降順で並べ、その順位表を作成するスクリプト。

 データは次のような項目の二次元配列として持つ。

|【アニメタイトル】|【公式サイトURL】|【被はてなブックマーク数】|

 これをスクリプトで処理した結果、次のような形式の順位表を出力したい。

|【順位】|【<a href="公式サイトURL">アニメタイトル</a>】|【被はてなブックマーク数】|

 手動集計していた時に意外と面倒だったのが、順位の決定。被はてなブックマーク数が同数で同順位になる場合を当然、考慮する必要があります。

■ソースコード

アニメサイト群は「アニメA,http://aaaa/,120
アニメB,http://bbbb/,3
アニメC,http://cccc/,30
アニメD,http://dddd/,30
アニメE,http://eeee/,0
アニメF,http://ffff/,30」。
順位表は「|順位|アニメタイトル|被ブックマーク数|{改行}」。
順位は0。
前データ値は0。
同順位数は1。

アニメサイト群は、アニメサイト群の2を表数値ソート。
回数で1から(アニメサイト群の表行数)まで繰り返す
  アニメサイト群[((アニメサイト群の表行数)-回数)]を「タイトル,URL,被ブックマーク数」へ変数分配。
  もし、(被ブックマーク数=前データ値)ならば
    同順位数に1を直接足す。
  違えば
    順位に同順位数を直接足す。
    同順位数は1。
  順位表は、順位表&「|第{順位}位」&
  「|<a href="{URL}">{タイトル}</a>」&
  「|{被ブックマーク数}|{改行}」。
  前データ値は被ブックマーク数。
ここまで
順位表をメモ記入。
母艦を閉じる。

■出力結果

|順位|アニメタイトル|被ブックマーク数|
|第1位|<a href="http://aaaa/">アニメA</a>|120|
|第2位|<a href="http://cccc/">アニメC</a>|30|
|第2位|<a href="http://dddd/">アニメD</a>|30|
|第2位|<a href="http://ffff/">アニメF</a>|30|
|第5位|<a href="http://bbbb/">アニメB</a>|3|
|第6位|<a href="http://eeee/">アニメE</a>|0|

おお!やっぱりスクリプト化すると作業が楽になるなぁ。

【追記】上記のスクリプトを使った記事を書きました。


サイトの被はてなブックマーク数の集計

| サイトの被はてなブックマーク数の集計 - そっとなでしこ を含むブックマーク はてなブックマーク - サイトの被はてなブックマーク数の集計 - そっとなでしこ

 というわけで、↑の2010年夏版をお手軽に作るためのスクリプト作成への道。その第一歩は、まずは指定したサイト全体の被はてなブックマーク数を取得するスクリプト。

 使用するのは、はてなブックマークのAPIの一つ、被ブックマーク合計数取得API(bookmark.getTotalCount)。XML-RPC方式のAPIです。

■ソースコード

#-----------------------------------------------------------------------
# 定数の定義/データの設定
#-----------------------------------------------------------------------
!API_URLは「http://b.hatena.ne.jp/xmlrpc」。
URLは「http://s-witch.cute.or.jp/」。
#-----------------------------------------------------------------------
# メイン処理
#-----------------------------------------------------------------------
URLから被ブックマーク合計数取得。
「{URL}|被ブックマーク合計数:{それ}」を表示。

#-----------------------------------------------------------------------
# 関数定義
#-----------------------------------------------------------------------
●被ブックマーク合計数取得(対象URLから)
  パラメータXMLはパラメータ設定(対象URL)。
  メソッドXMLはメソッド設定(「bookmark.getTotalCount」、パラメータXML)。
  被ブックマーク合計数取得XMLは「
<?xml version="1.0"?>
{メソッドXML}」。
  ヘッダは「」。
  結果は、ヘッダと被ブックマーク合計数取得XMLをAPI_URLへHTTPポスト。
  結果数値は、結果から「int」のタグ切り出してタグ削除。
  結果数値で戻る。

●パラメータ設定(パラメータ値)
  それは「<param><value><string>{パラメータ値}</string></value></param>」。
  それで戻る。
●メソッド設定(メソッド名,パラメータ群)
  それは「<methodCall><methodName>{メソッド名}</methodName><params>
{パラメータ群}</params></methodCall>」。
  それで戻る。


■参考リンク