忍者ブログ

カテゴリー:ruby

[PR]
×

[PR]上記の広告は3ヶ月以上新規記事投稿のないブログに表示されています。新しい記事を書く事で広告が消えます。

Yahoo!ファイナンスから為替時系列データをダウンロード
為替時系列データをYahoo!ファイナンスからダウンロードするためのソースコードを書きました。

Yahoo!ファイナンスでは、1999年からのデータが公開されています。このソースでは米ドル/円、豪ドル/円、英ポンド/円、カナダドル/円、スイスフラン/円、欧州ユーロ/円のレートを取得できます。保存先のファイル名は、それぞれ usdjpy.csv、audjpy.csv、gbpjpy.csv、cadjpy.csv、chfjpy.csv、eurjpy.csv です。
データは日付、始値、高値、安値、終値の順に記録されます。例、2008/9/22/,123.4,123.4,123.4,123.4

currency_exchange_rate.rb
require "open-uri"
require "date"
require "nkf"

today = Date.today
last_day = Date.new(1999,1,1)

exchange_type = ["usdjpy","audjpy","gbpjpy","cadjpy","chfjpy","eurjpy"]

exchange_type.each{|k|
    open("#{k}.csv","w"){|file|
        0.step(today - last_day,50){|i|
            url = open("http://table.yahoo.co.jp/t?s=#{k}=x&a=#{last_day.month}&b=#{last_day.day}&c=#{last_day.year}&d=#{today.month}&e=#{today.day}&f=#{today.year}&g=d&q=t&y=#{i}&z=#{k}=x&x=.csv")
            text = url.read
            text_sjis = NKF.nkf("-s",text)
            text_sjis.scan(/<small>(\d*)年(\d*)月(\d*)日<\/small>< \/td>.<td><small>([\d\.]*)<\/small><\/td>.<td><small>([\d\.]*)<\/small><\/td>.<td><small>([\d\.]*)<\/small><\/td>.<td><small>([\d\.]*)<\/small>/m){|matched|
                file.print(matched[0],"/",matched[1],"/",matched[2],",",matched[3],",",matched[4],",",matched[5],",",matched[6],"\n")
            }
        }
    }
}
 

悩んだこと
正規表現において".(ドット)"が改行文字にもマッチするための方法がわからなかった。 /hoge/mのようにオプションでmを指定すれば、改行文字にもマッチさせられる。
 
PR

霧積ダムのTwitterBotを作りました
twitterに自動でメッセージを投稿したくて、調べてみました。
まず、gem install twitter でインストールします。
次は、以下のようにソースコードを書くだけです。

twitter.rb
require 'rubygems'
require 'twitter'
require 'nkf'

#idとpasswordを入力
TWITTER_ID ='id'
TWITTER_PASSWORD='passward'
 
#メッセージを作成
message = NKF.nkf("-w","hello,world!")

#twitterに投稿
twitter = Twitter::Base.new(TWITTER_ID,TWITTER_PASSWORD)
twitter.update(message)

たったこれだけです。

文字コードをUTF-8に変換して送信するところで、つまづきました。
 

rubyでブログの画像を全部ダウンロード
あるブログを見ていて画像をダウンロードしたくなりました。firefoxのアドオンDownThemAll!を使って1ページごとに画像を落としていきました。しかし、エロ画像へのリンクは騙しがあるので、ファイルが無いページでもDownThemAll!を起動するのは面倒だし、何より時間の無駄だと思った。
昼間留守のうちにブログの画像を端から端まですべてダウンロードしておいて、帰ってきたら画像を見るだけだ、という状態を作りたいと思った。

そこで、最近始めたrubyを使ったら実現できるのではないかと思った。
いろいろ悩みながらソースコードを書いてみた。実行結果は下の写真のとおりうまくいった。これからは画像が沢山あるブログを見つけるだけだ。

ダウンロードした画像
ruby

今までの面倒な作業は何だったのだろうか。もっと早くrubyをやっていればよかった。

download

hpricotは標準ライブラリではないのでインストールしなくてはならない。
gem install hpricot でインストールする。

get_jpg.rb
require 'rubygems'
require 'hpricot'
require 'open-uri'
require 'net/http'

Net::HTTP.version_1_2
links_list = []
n = 1

#画像のuriを収集
for i in 0..50
  begin
    doc = Hpricot(open(uri = "http://doragong.19.dtiblog.com/page-#{i}.html").read.downcase)
  rescue
    sleep(1)
    retry
  end
  (doc/:a).each {|link|
    if link[:href] =~ /\.jpe?g/
      links_list << link[:href]
    end
  }
end

#画像をダウンロードして保存
links_list.uniq!.each{|link|
  if link =~ %r|http://(.*?)(/.*/(.*\.jpg))|
    print n,"\sDownloding...\s",link,"\n"
    begin
      open($3,"wb"){|file|
        Net::HTTP.start($1, 80) {|http|
          response = http.get($2)
          file.puts response.body
        }
      }
    rescue
      next
    end
    n += 1
  end
}

まずwebpageを開いて、画像のURIを収集します。URIはlinks_listという配列に入れます。次はURIをnet/httpを使ってダウンロードします。画像が開けなかった場合は、その画像が無いとして次の画像に移ります。

悩んだこと
ファイルをテキスト形式で保存してしまい、画像が見れなかった。wではなくwbとしてバイナリで保存したら解決した。
webpageに連続してアクセスしたため、強制的に切断されてしまうエラーが出た。error処理を行い、切断された場合には1秒後に再度アクセスするようにした。

参考文献
ページ内の画像を一括してダウンロードするRubyスクリプト
RubyでHTMLとWebを操作するためのライブラリ、HpricotとWWW::Mechanize
Ruby Scraping
最新CM
[10/29 rafting]
最新TB
アクセス解析

ジオターゲティング
カレンダー
04 2024/05 06
S M T W T F S
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
プロフィール
HN:
崖の上の宗介
性別:
非公開
ブログ内検索
カウンター
アクセス解析
バーコード