Socialtunesからエクスポートした風のcsvをつくるrubyスクリプト

メディアマーカーにインポートしたかったので。
Nokogiriという、hpricotより早いとかいてあったHTMLパーサを使って、地道にhtmlを解析して、CSVに書き込んでいくだけの。


が、結局出来上がったCSVを眺めながらこんなのチェックしてたの!という思い出浸りが始まってきていろいろ面倒になってきて、今に至る。


というわけで、書いたのを。

メディアマーカーにインポートしたいだけなので、コメントも書かない私はASINかISBNくらいしか必要な情報はないのだけれど、インポートするときの取捨選択の参考のためにタイトル・もちぺたの有無・ラベルをとってみた。

Nokogiriさんは、CSSの書き方でタグを指定できるのが私にはとてもわかりよくて素敵。

できあがるCSVはこんなの。漫画ばっかり。

4063800180,*,書籍: ブレイザードライブ 2 (2) (ライバルコミックス),漫画
4758053588,*,書籍: 橙星 1 (1) (IDコミックス ZERO-SUMコミックス),漫画
4344812751,*,書籍: ヘタリア Axis Powers,漫画
4063145379,*,書籍: 蟲師 10 (10) (アフタヌーンKC),漫画
4088746023,*,書籍: ONE PIECE 巻52 (52) (ジャンプコミックス),漫画
4088744632,*,書籍: SKET DANCE 1 (1) (ジャンプコミックス),漫画
4088745892,*,書籍: NARUTO 巻ノ44 (44) (ジャンプコミックス),漫画
475752031X,,書籍: ニコイチ 3 (3) (ヤングガンガンコミックス),借,漫画
4575835374,,書籍: つぶらら 4 (4) (アクションコミックス),借,漫画

あとはエクセル的なので開いたり並べ替えたりしてなんとかなるような。

#! /usr/bin/ruby -Ku

require 'rubygems'
require 'nokogiri'
require 'open-uri'

class GetCSVFromSocialtunes
  def initialize
    @username = "username"
    @page = get_page(1)
  end

  def get_page(num)
    # ページ数を指定して、そのページのnokogiriさんを取得する
    uri = URI.parse("http://socialtunes.net/?mode=user&act=peta&uname=" + @username + "&page=" + num.to_s)
    @page = Nokogiri::HTML.parse(uri.read)
  end

  def get_lastpage_num
    # ぺた数/50の切り上げ数字をlastpageとする
    @page.css('li.selected').each do |li|
      li.content =~ /(\d+)/
      @lastpage = ($1.to_f/50).ceil
    end
    return @lastpage
  end

  def get_itemlist(page)
    # 開いてるページから、商品リストを取り出す

    items = 50
    itemlist = []
    i = 1

    items.times do
      item = []
      page.css('div#peta' + i.to_s + '_box').each do |li|
        # ASINかISBNかどっちかわからないけど、どっちか
        (li.search('a').first.attributes['href']).to_s =~ /item\/(.*)\//
        asin =  $1

        # もちぺたがあれば*を、それ以外は""を。
        peta = ""
        li.css('span.peta_own').each do |p|
          peta = "*"
        end

        # タイトルを取得
        title =  li.search('a').first.attributes['title']
                
        # ラベルを。
        tags = []
        li.css('span.label_s > a').each do |label|
          tags << label.content
        end

        itemlist << [
          asin,
          peta,
          title,
          tags
        ]

        i+=1
      end
    end
    return itemlist
  end

  def make_csv
    # get_itemlistでつくったitemlistの配列を1行ずつ、じめじめcsvの最後に追加

    f = open("socialtunes.csv", "a")

    get_itemlist(@page).each do |page|
      f.puts page.join(',')
    end

    f.close
  end

  def run
    i = 0
    get_lastpage_num.times do
      @page = get_page(i)
      make_csv
      i+=1
    end
  end

end

a = GetCSVFromSocialtunes.new
a.run

小さい満足。