40歳からのキャリアチェンジ

20代はエンジニア・PM、30代はWeb系エンジニア向けのキャリアアドバイザー。40代の今はフリーランスで開発含めて色々やってます。技術ネタとしてはRuby/RailsとJavaScript関連あたり

エキサイトブログからのデータ移行ツールを現在開発中

靴下

この年末年始の時間があるうちに、過去使っていたエキサイトブログ(以下エキブロ)のデータをはてなに移行しようと考えたのですが、エキブロはブログの移行でインポート/エクスポートで利用されるMovableType形式ではなく、残念なことに独自のフォーマットなので簡単に移行できません。。。

ちょっと調べた感じでは、Perlエキブロのデータを、MovableType形式に変換するexblog2MTというツールを開発されていた方がいたので、これを試してみました。

実行する度に特定のモジュールが無いというエラーがで出るので、その都度このツールの中のLibraryに含まれるモジュールをのソースを読んで、HTML::TreeBuilderとかJcodeやらのCPANモジュールを入れて動かせるようにした(*)けど、1ページのみの取得はする時は正常に動作するが、一番古いエントリから100エントリ遡ってパースする場合などにエラーになるので利用を断念しました。

ただ諦めたわけでもなく、このツールを動かす際に試行錯誤した甲斐があってどのようにしてエキブロからデータ取得しようとしているかおおまかな動きがわかったので、それを参考にして自分で作ることにしました。

簡単に仕様まとめてしまえば

  1. データを取得する時の基点となるページを設定
  2. 1.で設定したページから必要な情報(タイトル、本文、配信された日付など)を取得
  3. 1.のページ中に次に更新されたエントリへのリンク先の有無を確認し、リンク先が設定される場合にはそのページに移動する
  4. ページ移動したら、2.移行の処理を行う

で動きそうな感じがしたので、Rubyで実装してみました。

Webサイトのスクレイピングする時にはNokogiri というのが便利そうなのでgem使ってインストールしてとりあえずですが、こんな感じでイケそうな感じがします。

完成度としてはまだ50%程度かと思っていて

  • 出力される日付の形式が、yyyy-mm-dd hh:mm:ssになっているが、mm/dd/・・・となっているのでこのフォーマットに変換しないといけない
  • エキブロのサーバに負荷をかけないように各ページの情報取得する時には連続して行わず一定の間隔を空けて処理をする
  • get_contensメソッドでファイル出力する処理がまだ未完成だけど、このままだと、puts xxxx が連続してメンテナンス性が良く無いしソースがあまり美しくない
  • そもそもテストコードが無い!

あたりが当面の課題かも。あとはネットに繋がる環境で必ずしも開発出来るわけではないのでオフラインで開発する場合はどうすればいいんだろうか?

ベタに考えると、基点となるページから数ページをローカルに保存しておいて、それを対象にパースするようにすればいいんだろうけど、もっとスマートなやり方ってありそうだもんなぁ。

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

class Exblog2MT
  def initialize(url="http://dmyoh.exblog.jp/8728231/";)
    @url = url
  end
  attr_accessor :post_date
 
  def start_parse
    self.move_to(@url)
  end

  def get_contens(url)
    doc = Nokogiri::HTML(open(url))
    @post_date = doc.search('span[@class="TIME"]/a').text
    html_body = doc.search('//div[@class="POST_BODY"]').inner_html
    f = File.open("blogdata.txt","a")
    f.puts "DATE:" +@post_date
    f.puts "-----\n"
    f.puts "BODY:" + html_body   
    f.close
  end
 
  def move_to(url)
    doc = Nokogiri::HTML(open(url))
    loop do
      _nextlink=""
      self.get_contens(url)
      doc.search('td[align="RIGHT"][width="48%"]').map {|link| _nextlink=link.search('@href').text}
      if _nextlink.strip.empty? == false then
        move_to(_nextlink)
      else
        exit
      end
    end
  end
end

exblog = Exblog2MT.new()
exblog.start_parse

(*) よくよくみたら、exblog2MTのwebサイトのページ真ん中あたりに、依存しているCPANモジュールの記載がありました。何でもそうですが最初にドキュメントを読むべきですね。。。