Hatena::Grouprubyist

今日も元気にrubyist

2007-06-22

[](小ネタ)Hpricotを使って人狼BBSの参加者リストを作成する。 11:17 (小ネタ)Hpricotを使って人狼BBSの参加者リストを作成する。 - 今日も元気にrubyist を含むブックマーク はてなブックマーク - (小ネタ)Hpricotを使って人狼BBSの参加者リストを作成する。 - 今日も元気にrubyist (小ネタ)Hpricotを使って人狼BBSの参加者リストを作成する。 - 今日も元気にrubyist のブックマークコメント

人狼BBSのアクティブユーザー、ヘビーユーザーの割合が知りたかったので

参加者リストを取得しIDを抜き出すスクリプトを作成しました。

require 'hpricot'
require 'open-uri'

#uptoメソッドetcを使用して繰り返し実行(今はしない)
#501.upto(1300) do |i|
doc = Hpricot(open(%Q[http://ninjin002.x0.com/wolff/index.rb?vid=1132]))

#エピローグのURLを取得
elem = (doc/%Q[//a]).each do |elem|
  @url = "http://ninjin002.x0.com/wolff/" + elem.to_html.sub(%Q[<a href="],"").sub(%r/">.*/,"") if elem.inner_text == "エピローグ"
end

#エピローグにアクセスし、参加者リストを取得
#http://ninjin002.x0.com/wolff/index.rb?vid=1132&meslog=1132_party_6
doc = Hpricot(open(@url))
elem = (doc/%Q[div.announce]).each do |elem|
  @entry = elem.inner_text if elem.inner_text =~ /^楽天家 ゲルト/
end

#参加者リストをパースしてIDを抜き出す
puts @entry.scan(%r[((.*?))])

作成時間30分(これでも遅いと思う)。マジHpricotは神だなー。

あとはDBに入れて見せ方を考えればOK。

[](小ネタ続き)取得した人狼BBS参加者リストを解析 15:48 (小ネタ続き)取得した人狼BBS参加者リストを解析 - 今日も元気にrubyist を含むブックマーク はてなブックマーク - (小ネタ続き)取得した人狼BBS参加者リストを解析 - 今日も元気にrubyist (小ネタ続き)取得した人狼BBS参加者リストを解析 - 今日も元気にrubyist のブックマークコメント

参加者IDをこんな感じでテキストファイルに保存。

=====501村=====
master
knight
・
・
・
seena
totoro
=====502村=====
master
yamadayama
・
・
・
bdheki
turugi

これを以下のスクリプトで解析

require 'benchmark'
puts Benchmark.measure {
  file = File.open("C:/share/jinro_list.txt")
  @arr = Array.new
  file.each_line do |line|
    line = line.chomp!
    next if line =~ /=====/
    if @arr.assoc(line)
      elem = @arr.assoc(line)
      @arr.delete(@arr.assoc(line))
      @arr << [line,elem[1] + 1]
    else
      @arr << [line,1]
    end
  end
}

@arr.each do |elem|
  puts elem.join("\t")
end

@arrは2重配列でデータベース的役割を果たす。

1回目に登場したIDは[ID名、1]の形式で@arrに入力。

2回目以降は[ID名、登場回数]を[ID名、登場回数+1]とする。

最後にお約束のarr.eachで出力して終了。

#assocは2重配列を処理するのにすごぶる便利な関数です。

#assocは2重配列の0番目の要素を検索し、ヒットすると配列を返す。

# ID,参加回数の形式で収納
arr = [
["master",5],
["teraco",1],
["dolp",8],
["namayo",13],
["aiko",2]
]

# xの参加回数を調べる場合
p arr.assoc("namayo") #=> ["namayo", 13]
p arr.assoc("namayo")[1] #=> 13

欠点は最初にヒットした要素しか返さないこと。0番目の要素をキーとしユニークとなる配列を組む必要がある。

2重配列の1番目の要素を検索し、ヒットすると配列を返す#rassocメソッドもご参考。

kenaxtkenaxt2007/10/11 02:12hpricot面白そうですね。
所で、一覧作成にはHashを使っても良いのでは?
変更する場合は、@arrは、@hashくらいの名前にした方が吉分かりやすいかと思います。


diff bench.rb bench2.rb
4c4
< @arr = Array.new
---
> @arr = Hash.new(0)
8,14c8
< if @arr.assoc(line)
< elem = @arr.assoc(line)
< @arr.delete(@arr.assoc(line))
< @arr << [line,elem[1] + 1]
< else
< @arr << [line,1]
< end
---
> @arr[line] += 1

teracoteraco2008/02/20 17:08アドバイスありがとうございます!
早速試します♪

QueenieQueenie2011/09/08 19:09Yeah that's what I'm tlaikng about baby--nice work!

owhrvajgowhrvajg2011/09/09 00:29SFqsTa <a href="http://xwhfraecqhoh.com/">xwhfraecqhoh</a>

qyolyfrqyolyfr2011/09/09 21:10xSVTRR , [url=http://kmwbomxmvacv.com/]kmwbomxmvacv[/url], [link=http://kergceolgqvw.com/]kergceolgqvw[/link], http://dpxraocgprqn.com/

bjooufdibjooufdi2011/09/11 23:504lB1fH <a href="http://slpdzalsaxuw.com/">slpdzalsaxuw</a>

uibzqwecquibzqwecq2011/09/12 18:57CLYzBj , [url=http://flcavihyaevy.com/]flcavihyaevy[/url], [link=http://jsxtnanzpizt.com/]jsxtnanzpizt[/link], http://tbxpbtcwtzkt.com/