Hatena::Grouprubyist

たばさの RSSフィード

12/14(日) 2008

hateb_followers 続き。

| hateb_followers 続き。 - たばさの を含むブックマーク はてなブックマーク - hateb_followers 続き。 - たばさの

http://rubyist.g.hatena.ne.jp/hatecha/20081211/p1

http://rubyist.g.hatena.ne.jp/hatecha/20081212/p1

都合によりfollowersじゃなくてfavoriteを使うように変更。

(変えたのはおもにscrapeの引数'*[class="sidebar-users tile"] a'の部分のみ)

参考 => http://labnotes.org/svn/public/ruby/scrapi/cheat/scrapi.html , http://b.hatena.ne.jp/t/scrapi

hatebmap2.txtというカラのファイルを作っておく。


>ruby -W0 hatebmap.rb

でいくらか取得したあと、

>ruby hatebmap_log.rb

6436

input (name, -name, >followmin, <followmax, =followeq)

:hatecha

/hatecha/(24) >> /hoge/(12) /huge/(21) (略)

:-hatecha

12

/hoge/(12) /hige/(23)(略)

:>500

/ashitano244/(2548) /toratorazero/(716) /nobody/(2461) /lovelovedog/(662)

など。

#!ruby
#hatebmap_log.rb

$fl=""
$logname="hatebmap2.txt"

def putlog id,fs,flag=$fl
  (puts flag,id,fs;return) if flag!=""
  open($logname,"a"){|f|
    id=~/\/(.*)\//
    f.puts $1
    fs.each{|i|
      i=~/\/(.*)\//
      f.print $1," "
    }
    f.puts
  }
end

def getlog mode=0
  x=[];y=[]
  open($logname){|f|
    while f.gets
      x << "/#{$_.chomp}/"
      if mode==0
        y += f.gets.split.map{|i|"/#{i}/"}
      else
        y += [f.gets.split.map{|i|"/#{i}/"}]
      end
    end
  }
  [x,y]
end

class Array
  def form
    #p self.size
    self.map{|i|"#{i}(#{$f[i]?$f[i].size: 0})"}*" "
  end
end

def help
  puts"  hatena-user-id (some regexpression) ",
      "  - followed",
      "  > favorite-number-min",
      "  < favorite-number-max",
      "  = fovorite-number-equal",
      "  [enter] quit"
end

if __FILE__ == $0
  x,y=getlog -1
  $f={}
  x.size.times{|i|$f[x[i]]=y[i]}
  p $f.size
  prompt=":"
  puts"input (name, -name, >followmin, <followmax, =followeq)"
  print prompt
  while gets
    break if $_=="\n"
    case $_
    when /^-/
      id=$_.chomp[1..-1]
      puts (ans=$f.keys.select{|k|$f[k].select{|i|/\/#{id}\// =~ "#{i}";$&}.size>0}).size, ans.sort.form
    when /^>(.*)/
      min=$1.to_i
      puts $f.keys.select{|k|$f[k].size>min}.form
    when /^<(.*)/
      max=$1.to_i
      puts $f.keys.select{|k|$f[k].size<max}.form
    when /^=(.*)/
      m=$1.to_i
      puts $f.keys.select{|k|$f[k].size==m}.form
    when "help\n"
      help
    else
      puts $f.keys.select{|i|/#{$_.chomp}/ =~ "#{i}";$&}.map{|i|"#{i}(#{$f[i].size}) >> #{$f[i].form}"}.sort
    end
    print prompt
  end
end

メイン


#!ruby
#hatebmap.rb

require 'nkf'
require 'open-uri'
require 'scrapi'
require 'hatebmap_log'
$KCODE = 'u' 
#$KCODE='s'
id="/hatecha/" #=> 書き換えましょう

class String
  def scrape(pattern, options = {}, &block)
    options = {:extract=>options} unless options.is_a?(Hash)
    options[:parser_options] = {:char_encoding=>'utf8'}.merge(options[:parser_options]||{})
    extract = options.delete(:extract) || block && :element || :text
    scraped = Scraper.define do
      process pattern, "matches[]"=>extract
      result :matches
    end.scrape(self, options) || []
    block ? scraped.map{|i| block.call(i)} : scraped
  end
end

def gethtml id,t=1.3
  urlb="http://b.hatena.ne.jp"
  url=urlb+id+"favorite"
  sleep t
  print"."
  NKF.nkf('-w', open(url).read)
end


def followers id,html
  word=".followers a"
  html.scrape(word,"@href"){|i| i}
end

def favorite id,html
  word='*[class="sidebar-users tile"] a'
  html.scrape(word,"@href"){|i| i}
  #html.scrape(word){|i| i}
end

$x,$keys=getlog
puts "#{$keys.size}(#{($keys-$x).size})"
$res=[]
html =gethtml id
#p html
$res =favorite id,html
#p $res
putlog id,$res if not $x.member? id
$x << id
$keys += $res
#puts $keys
print"depth:"
n=gets.to_i
n.times{|i|
  ($keys-$x).each{|k|
  begin
    html=gethtml k
    $res =favorite k,html
    $x << k
    $keys += $res-$x
    $keys.sort!.uniq!
    putlog k,$res
  rescue Exception=>e
    puts "Exception, #{e},#{k}"
    sleep 4
  end
  }
}
puts "all: #{$keys.sort.uniq.size}, done: #{$x.sort.uniq.size}"

ておもったらAPIあるな

ておもったらAPIあるな - たばさの を含むブックマーク はてなブックマーク - ておもったらAPIあるな - たばさの

お気に入りのユーザー情報を取得できる「お気に入りAPI

http://d.hatena.ne.jp/hatenastar/20070913/1189667860

て思ったら違うな

トラックバック - http://rubyist.g.hatena.ne.jp/hatecha/20081214
カレンダー
<< 2008/12 >>
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30 31
archive Error : RSSが取得できませんでした。