selflearn @ ウィキ

はてブ人気エントリ収集 プログラム置き場

最終更新:

匿名ユーザー

- view
メンバー限定 登録/ログイン

プロトタイプ第1弾

はてなの人気エントリのページにアクセスし、エントリのタイトルとURLを取得します。
ポイントは、
  • uriとnet/httpモジュールは便利
  • 取得したタイトルとURLをハッシュのリストで管理
  • WindowsのコマンドプロンプトがUTF-8を表示できない(文字化けする)のでshift-jisに変換
  • get_page()からparse_page()を読んでる箇所がなんか変
といったところです。
さっぱりしていないですが、今日はこのぐらいで。

require 'net/http'
require 'uri'
require 'kconv'

class HatenaBookmarkReader

 def initialize()
   @title_uri_array = nil
   @page_text = nil
 end

 def get_page(site_url)
   uri = URI.parse(site_url)
   Net::HTTP.version_1_2
   Net::HTTP.start(uri.host, uri.port) do |http|
     response = http.get(uri.request_uri)
     @page_text = Kconv.tosjis(response.body)
   end
   parse_page()
 end

 def parse_page
   @title_url_array = Array.new()
   flag = false
   @page_text.each_line do |line|
     flag = true if line == "<div class=\"entry-body\">\n"
     if flag
       if line =~ /^<a href="(http.+?)".+target="_blank">(.+?)<\/a>/
         result= Hash.new()
         result[:link] = $1
         result[:title]= $2
         @title_url_array.push result
         flag = false
       end
     end
   end
 end

 def title
   @title_url_array.each do |element|
     print element[:title], "\n"
   end
 end

 def to_csv
   print "未実装"
 end
end

# 使い方
h = HatenaBookmarkReader.new
h.get_page('http://b.hatena.ne.jp/hotentry')
h.title

プロトタイプ第2弾

第2弾です。
修正点は、
  • parse_page()のマッチング処理の箇所をシンプルに
  • ハッシュの配列で管理していたタイトルとURLの情報を新規に作成したHatenaHotEntryクラスで管理
です。

まだ各エントリの本文を取得するところを実装していないですが、HatenaHotEntryクラスにget_page()メソッドを作ったので、あとはループなりで本文をとってくるというところでしょうか。

あと、
  • はてなのページからタイトルとURLだけではなくブックマーク数も取得しよっか
  • 最近の人気エントリだけでなく、日数指定で過去に遡って人気エントリの情報を収集
などを入れていければいいかなと。

ダウンロードは、HatenaBookmarkReader.rbからできます。

require 'net/http'
require 'uri'
require 'kconv'

class HatenaHotEntry
 attr_accessor :blog_title, :blog_body, :blog_url
 def initialize()
     @blog_title = nil
     @blog_body = nil
     @blog_url = nil
 end

 def get_page()
     uri = URI.parse(@blog_url)
     Net::HTTP.version_1_2
     Net::HTTP.start(uri.host, uri.port) do |http|
         response = http.get(uri.request_uri)
         @blog_body = Kconv.tosjis(response.body)
     end
 end
end

class HatenaBookmarkReader
  
 def initialize()
     @entry_array = nil
     @page_text = nil
 end

 def get_page(site_url)
     uri = URI.parse(site_url)
     Net::HTTP.version_1_2
     Net::HTTP.start(uri.host, uri.port) do |http|
         response = http.get(uri.request_uri)
         @page_text = Kconv.tosjis(response.body)
     end
     parse_page()
 end

def parse_page
  @entry_array = Array.new()
  @page_text.each_line do |line|
    if line =~ /^<a href="(http.+?)".+class="bookmark" target="_blank">(.+?)<\/a>/
      entry = HatenaHotEntry.new()
      entry.blog_url = $1
      entry.blog_title = $2
      @entry_array.push entry
    end
  end
end

 def title
     @entry_array.each do |element|
         print "#{element.blog_title}\n"
     end
 end

 def to_csv
     print "未実装"
 end
end

# 使い方
hatena = HatenaBookmarkReader.new
hatena.get_page('http://b.hatena.ne.jp/hotentry')
hatena.title

コメント

名前:
コメント:

タグ:

開発 Aquarius
記事メニュー
目安箱バナー