Hatena::Grouprubyist

たばさの RSSフィード

06/10(火) 2008

とりあえず新着データを追加していく

とりあえず新着データを追加していく - たばさの を含むブックマーク はてなブックマーク - とりあえず新着データを追加していく - たばさの

はてなダイアリー新着日記のリストをcsv,sqlite3に保存。前回のよりも新しそうなのだけ(多少重複あり)。ソートなし。データベースだから何とかなるんじゃないかと。まだ勉強しないと分からないけども。

そのうち最初からdatabaseに入れるようにする。


とテストしようとしたらはてなダイアリーが落ちてた。しかしgroupは動いてた。

main batch

getHDNew2csv.rb
csv-max-min.rb hd-new-csv.txt
csv-max-min.rb testhcsv.txt
pause
hd-sqlite.rb testhcsv.txt
type testhcsv.txt >>hd-new-csv.txt
# hcsv.rb
require'csv'
require'open-uri'
require'mechanize'

class HCSV
  @file
  def initialize(f)
    @file = f
  end
  attr_accessor:file
  def read
    if File.exist? @file
      CSV.readlines(@file)
    else
      nil
    end
  end

  def write d
    CSV.open(@file,"w"){|i| d.each{|v| i<<v}}
  end
end
# getHDNew2csv.rb
require'csv'
require'open-uri'
require'mechanize'

require'hcsv'

open('hd-new-csv.txt'){|f|$lastdate=f.readlines[-1]}
puts "last:#$lastdate"
url0="http://d.hatena.ne.jp/diarylist?of="
log=[]
num=ARGV[0].to_i
st=ARGV[1].to_i
num=40000 if num==0
ti=2
open('tmp.txt',"w"){} if st==0
open('tmp.txt',"a"){|tm|
  st.step(num,50){|i|
    sleep ti
    flag=false
    url="#{url0}#{i}"
    begin
      dat = WWW::Mechanize.new.get(url).root.search('li').search('img').map{|e| 
              ti=e.parent.children[0].to_s
              flag=true if ti<$lastdate
              tm << ti << "," << e['title'] << "\n"
              [ti,e['title']]
      }
    rescue
      print "(rescue)"
      sleep 5
      print "(retry)"
      retry
    end
    log.concat dat
    p dat[-1] # if $DEBUG
    print".",i
    (puts "end.";break) if flag
   # gets
   # open(url){|u| p u.readlines.size,url}
  }
}
log2= log.sort!.uniq!.inject([]){|res, i|
  res << i if i[1] > $lastdate
  res
}


hcsv= HCSV.new("testhcsv.txt")
#p hcsv.read
hcsv.write(log2)

p hcsv.read.size
# csv-max-min.rb
a=File.read(ARGV[0])
p a.max, a.min
# hd-sqlite.rb
require 'sqlite3'
require 'hcsv'

db = SQLite3::Database.new("hdp.db")

SQL=<<EOS
create table tbl_test (
    date  text,
    id  text
);
EOS

# 初回はこれを実行してテーブルを作成
#db.execute(SQL)


file="hd-new-csv.txt"
file=ARGV[0] if ARGV.size>0
puts file,"OK?"
gets
puts"start."
data= HCSV.new(file).read

data.each{|date,id|
   print"."
   db.execute("insert into tbl_test (date, id) values('#{date}', '#{id}')")
}


そのまえにidリストから検索ワードを探すのを作ったけど(rubyを含む日記を探すなど)

# searchfromHDP.rb
require 'rubygems'
require 'mechanize'
require 'open-uri'
require 'get_rss'
require 'nkf'



hdpf='programmer-inHD.txt'
hdp_nglist="HDP-nglist.txt"

usage="search key in #{hdpf}-#{hdp_nglist}\nusage: #{$0} key\n"

word=ARGV[0]
(puts usage;exit) if word =="" ||word==nil



def getlist file
  hdp=[]
  open(file){|i| hdp=i.readlines.map{|k|k.chomp}}
  hdp
end

def search u,key,ti=1
  res=false
  ["about","keywordcloud","archive",""].each{|f|
    open( "http://d.hatena.ne.jp/#{u}/"+f ){|i|
       (puts"#{u}:#{f}_#{$&}";res=true) if i.readlines.join =~ /#{key}/
    }
    print"."
    sleep ti
    return true if res
  }
  false
end

$hdp0=getlist hdpf
$ng=getlist hdp_nglist

$hdp=$hdp0-$ng
$res=[]
$hdp.each{|i|
   $res << i if search(i,word)
}
puts $res
open('hdpsearchtmp.txt',"w"){|f| f.puts $res}

検索するたびにいちいち大量にアクセスしてしまうので大迷惑。ローカルに保存しないと。どこまで?どうするか。ローカルにないものだけ追加でアクセス、保存するように。

トラックバック - http://rubyist.g.hatena.ne.jp/hatecha/20080610
カレンダー
<< 2008/06 >>
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
archive Error : RSSが取得できませんでした。