2chのスレッド内のレスを取得する

2chの各々のスレッドのエンコードは、Shift-JISなので一回Shift-JISに直してから、データを取り扱ってやる。必要なところでutf-8になおしてやる。


だいたい以下のような感じ。

require 'nokogiri'
require 'open-uri'

def get_res_params(thread_url)
  res = open(thread_url).read.force_encoding('cp932')
  parsed = Nokogiri::HTML.parse(res)

  parsed.css('.thread dd').map do |dd|
    begin
      meta_data = dd.previous
      
      #レス本文
      res_content = dd.text
      #1 :hogeさん:2013/09/23(月) 20:06:36.74
      res_data = meta_data.text
      #レス番号
      res_id = meta_data.children.first.to_s.encode('utf-8')[0..0]
      {
        res_id: res_id,
        res_data: res_data,
        res_content: res_content
      }
    rescue Exception => e
      nil
    end
  end.compact
end

url = 'http://awabi.2ch.net/test/read.cgi/minor/1328187887/'
get_res_params(url)


上記のスクリプトでは、ハッシュの配列が返ってくる。

Array.compact

あとArray.compactっていうのが知らなかったけど、

[1, 2, nil, 3].compact

#=>[1, 2, 3]

このようにnilを省いた配列を返してくれる。

参考

色々ググってたら出てきたので、以下のスクリプトを参考にさせて頂いた。

2ch crawler
https://gist.github.com/skuroki/4224022