koboの書籍購入リストをRubyのMechanizeでスクレイピングしてみた。

電子書籍の値引き大戦が激しく続いてますね。
koboで買ったりamazon kindleで買ったりとしているうちに
どっちで何を買ったのやらワケワカになってきたので、
koboの購入リストをスクレイピングで入手してみることにしました。
うまく動いたのでメモっときます。

書名とURLだけを拾ってます。
ちなみにURLをみると商品コードっぽい値
(以下だと、book-Y3K0n79Qi02XUP7okD6ngg)が
埋まっているようにもみえます。

http://rakuten.kobobooks.com/ebook/%E4%BF%A1%E9%95%B7%E3%81%AE%E3%82%B7%E3%82%A7%E3%83%95-1%E5%B7%BB/book-Y3K0n79Qi02XUP7okD6ngg/page1.html

しかし、商品ページに行くと

商品番号: 4911923890001

という記述があったりでどのコードで管理されているのかちょっとわからない感じです。
amazonのASINみたいなのがあると整理しやすくていいのですけどねー。

require 'mechanize'

USERID = "<koboのID>"
PASSWORD = "<パスワード>"


agent = Mechanize.new
agent.verify_mode = OpenSSL::SSL::VERIFY_NONE  # SSL証明書を検証しない
agent.user_agent_alias = "Windows IE 7"


# ログインする
agent.get("https://rakutensecure.kobobooks.com/auth/Rakuten/login") do |page|
  page.form["EditModel.RakutenUsername"] = USERID
  page.form["EditModel.Password"] = PASSWORD
  page.form.submit
end


# ライブラリリストを読む
books = {}
agent.get("https://rakuten.kobobooks.com/library/reading.html") do |page|
  # 全ページ数を調べる
  doc = Nokogiri::HTML(page.body)
  totalpage_size = doc.xpath('//span[@class="SCPagingNumTotalPages"]').first.text.to_i

  # ページ数だけ繰り返す
  totalpage_size.times do
    doc = Nokogiri::HTML(page.body)
    # <h3>は他にもあるけれど中に<a>があるのは書誌情報だけなのでこれで
    doc.xpath('//h3/a').each do |a|
      books[a.text] = a['href']
    end

    # <a id="ctl00_...>をクリックで次ページ
    page = agent.page.link_with(:dom_id => "ctl00_ctl00_ctl00_Body_Body_ContentBody_cntlPaginationBottom_linkNextPage").click
  end
end


# とりあえずてきとー出力
books.sort.each do |n,u|
  puts n
end

puts books.size

動作確認時には、agent.history(アクセス履歴)が便利だったので忘れないようにしたい。