プロトタイプ第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