今日も元気にテクニカル

技術情報書きたいけど本ブログに書きたくないからこんな名前になりました。

bloombergからWTI原油の価格を取得するスクリプト

# 2008/09/04 bloombergのいろいろな指数を取得するスクリプト

require 'mechanize'
require 'kconv'

# 0.初期設定
agent = WWW::Mechanize.new

def write(arr)
  f = open("C:/share/03_scr/bloomberg/bloomberg.txt", "a") 
  f.write(arr.join("\t"))
  f.write("\n")
  f.close
end

# 1.bloombergにアクセス
page = agent.get('http://www.bloomberg.com/markets/commodities/energyprices.html')
#page = agent.get('http://www.bloomberg.com/markets/asia_index.html')

arr = []
# 1.span classで回す
(page/"span").each do |text|
  # 2.tbl_txtクラスかつ最後の一文字が英文字かどうか←(前日と価格が変わらなかったときの対策)
  if text.to_html =~ /<span class="tbl_txt">.*/ && text.inner_text =~ /^.*\w$/
    # 1.今まで溜まっている単語列が5個かどうか?
    if arr.size < 5
      # 1.4個以下なら不正な行としてその行を削除
      arr = []
      arr << text.inner_text
    elsif arr.size == 5
      # 2.5個なら結果出力
      write(arr)
      arr = []
      arr << text.inner_text
    else
      # 3.6個以上なら6番目以降の要素を削って出力
      arr = arr.slice(0..4)
      write(arr)
      arr = []
    end
  else
    # 3.それ以外のクラスなら配列に代入
    arr << text.inner_text
  end
end

Webアクセスまでは楽勝だけど、その後の文字整形(成型?)が大変。
ちゃんとタグ分けされてないのでまずspanクラスを全部取り出す。
その中で指数クラスが所属するtbl_txtクラスをキーにして整形。
ただしその他の要素にも同じタグが使われてるので
指数,価格,前日比,前日比(%),データと5つの要素が揃ったときのみ
ファイルに書き出すようにした。

まぁめんどくさいといっても30分くらいで出来上がったのだが、
力技なので充実感とか知的好奇心が満たされたって感じはないなぁ。

あ、bloombergのサイトは全部同じ形式なので
アドレス変えれば日経平均やダウ平均も取得できると思います。