毎回毎回Eclipse立ち上げてjavaってのも大げさだし、実行ファイルとソースコードを両方管理しないといけないのは面倒。c#も同じく。
書き捨てのスクリプト言語では、今までphpを使っていたんだけど流石にあんまりなのでrubyを使ってみた。phpだとwindows上で日本語ファイルの扱いがめっちゃ面倒。
試しにOriconのサイトからランキングのデータを抜いてローカルに保存するコードを書いてみた。日時オブジェクトの操作、httpGetでの取得、正規表現取り扱い、ローカルに日本語unicodeファイルを作成、クラスの構文、例外を投げる書き方を試す。
require 'net/http'
require "date"
require 'json'
class OriconCdRanking
def get( timeFromArg , timeToArg )
timeFrom = getBeforeMonday( timeFromArg )
timeTo = getNextMonday( timeToArg )
getOneDay( timeFrom )
end
# 前の月曜日を返す。引数が既に月曜日ならそれを返す
def getBeforeMonday(timeArg)
time=timeArg
while time.monday? == false
time = time - 24*60*60
end
return time
end
# 次の月曜日を返す。引数が既に月曜日ならそれを返す
def getNextMonday(timeArg)
time=timeArg
while time.monday? == false
time = time + 24*60*60
end
return time
end
def getOneDay( getTimeArg )
# http://www.oricon.co.jp/rank/js/w/2015-05-04/p/2/
if getTimeArg.monday? == false
raise ArgumentError, "月曜日じゃない"
end
urlDate = getTimeArg.strftime("%Y-%m-%d")
result = []
for i in 1..5
# urlPathを定義
if i == 1 then
urlPath = "/rank/js/w/%s/" % urlDate
elsif
urlPath = "/rank/js/w/%s/p/%d/" % [ urlDate , i ]
end
responceStr = Net::HTTP.get('www.oricon.co.jp', urlPath)
responceStr = responceStr.encode("UTF-8", "Shift_JIS")
responceStr.scan(/<p class="num[^"]*">\d+<\/p>.+?<!-- \/.wrap-text -->/m) do |loopStr|
matchRank = loopStr[/<p class="num[^"]*">(\d+)<\/p>/,1] || ""
matchImage = loopStr[/<img src="(.+?)"/,1] || ""
matchTitle = loopStr[/<h2 class="title">(.+?)<\/h2>/,1] || ""
matchLink = loopStr[/class="inner"><a href=\"(.+?)\">/,1] || ""
matchName = loopStr[/<p class="name">(.+?)<\/p>/,1] || ""
matchDate = nil
if loopStr[/<ul class="list">.*?<li>.*?発売日:.*?(\d+)年(\d+)月(\d+)日/m] then
matchDate = Time.local( $~[1].to_i , $~[2].to_i , $~[3].to_i )
end
matchLabel = ( loopStr[/<ul class="list">.*?<li>.*?<\/li>.*?<li>(.+?)<\/li>/m,1] || "" ).strip
oneData={
:rank => matchRank ,
:image => matchImage ,
:title => matchTitle ,
:link => matchLink ,
:name => matchName ,
:date => matchDate ,
:label => matchLabel
}
result << oneData
puts JSON.generate(oneData)
end
end
File.open("結果 日本語 ❤.txt", "w") do |file|
result.each{|resultLoop|
file.puts(JSON.generate(resultLoop))
}
end
end
end
t1 = Time.local(2015,1,2)
t2 = Time.local(2015,12,1)
a = OriconCdRanking.new()
a.get( t1 , t2 )
コードは未完成で、本当は指定した範囲の全部のランキングを取得するはずだったけど自重。日本語のファイル名を扱えるのが特にいいね。ちょっとした書き捨てスクリプトなら全然書けそう。ただクラスを定義してからじゃないと使えないのはちょっとな。一つのファイルに書こうとすると、クラスを書いた下にmain的な処理を書く必要があって見にくい気がする