#!/usr/bin/ruby # tom.luo@gmail.com # v1: 2009-07-24 # v2: 2009-10-11 replaced gsubs with scan # 1. Save this file as quotes.rb # 2. Save the symbols.txt # 3. ./quotes.rb # 4. It will output quotes.csv require 'open-uri' require 'net/http' time = Time.new time_str = time.strftime("%Y%m%d") keys = ["SYMBOL", "PRICE","CHANGE","CHANGE_PCT","LOW","HI","52W_LOW","52W_HI","OPEN","VOL","AVG_VOL","MKT_CAP","PE","PE2","DIVIDEND","EPS","SHARES","BETA","INST_OWN"] keys.each {|x| print x+"|"} puts "\n" def getQuotes(symbol) h = Net::HTTP.new('www.google.com') response = h.get('/finance?q='+symbol) @quotes_str = symbol + "|" if response.message == "OK" pr = response.body.scan(/class="pr">[\n].*">([0-9]*\.?[0-9]*)<\/span>/)[0].to_a.join chg = response.body.scan(/class="ch bld">.*">([-+]?[0-9]*\.?[0-9]*)<\/span>/)[0].to_a.join chg_pct = response.body.scan(/class="ch[g|r]".*">(\([-+]?[0-9]*\.?[0-9]*%\))<\/span>/)[0].to_a.join hi = response.body.scan(/Range<\/span>\n.*">([0-9]*\.?[0-9]*) - [0-9]*\.?[0-9]*<\/span>/)[0].to_a.join low = response.body.scan(/Range<\/span>\n.*">[0-9]*\.?[0-9]* - ([0-9]*\.?[0-9]*)<\/span>/)[0].to_a.join year_hi = response.body.scan(/52 week<\/span>\n.*">([0-9]*\.?[0-9]*) - [0-9]*\.?[0-9]*<\/span>/)[0].to_a.join year_low = response.body.scan(/52 week<\/span>\n.*">[0-9]*\.?[0-9]* - ([0-9]*\.?[0-9]*)<\/span>/)[0].to_a.join open = response.body.scan(/Open<\/span>\n.*">([0-9]*\.?[0-9]*)<\/span>/)[0].to_a.join vol = response.body.scan(/Vol \/ Avg\.<\/span>\n.*goog-inline-block val">(.*)\/.*<\/span>/)[0].to_a.join avg_vol = response.body.scan(/Vol \/ Avg\.<\/span>\n.*goog-inline-block val">.*\/(.*)<\/span>/)[0].to_a.join mkt_cap = response.body.scan(/Mkt cap<\/span>\n.*goog-inline-block val">(.*)<\/span>/)[0].to_a.join pe = response.body.scan(/P\/E<\/span>\n.*goog-inline-block val">(.*)<\/span>/)[0].to_a.join div = response.body.scan(/Div\/yield<\/span>\n.*goog-inline-block val">(.*)<\/span>/)[0].to_a.join # yld = response.body.scan(/Div\/yield<\/span>\n.*goog-inline-block val">.*\/(.*)<\/span>/)[0].to_a.join eps = response.body.scan(/EPS<\/span>\n.*">([0-9]*\.?[0-9]*)<\/span>/)[0].to_a.join shares = response.body.scan(/Shares<\/span>\n.*goog-inline-block val">(.*)<\/span>/)[0].to_a.join beta = response.body.scan(/Beta<\/span>\n.*">([0-9]*\.?[0-9]*)<\/span>/)[0].to_a.join inst_own = response.body.scan(/Inst. own<\/span>\n.*">([0-9]*\.?[0-9]*%)<\/span>/)[0].to_a.join @quotes_str += pr +'|'+ chg + '|' + chg_pct + '|' + hi + '|' + low + '|' + year_hi + '|' + year_low + '|' + open + '|' + vol + '|' + avg_vol + '|' + mkt_cap + '|' + pe + '|' + div + '|'+ eps + '|' + shares + '|' + beta + '|' + inst_own + '|' @quotes_str.gsub!(/\ \ \ \ -/,"0.0") return @quotes_str end end counter = 0 quotes_file = File.open("/home/oracle/stocks/ruby/quotes_"+time_str + ".csv","a") symbols_file = File.new("/home/oracle/stocks/ruby/symbols.txt", "r") keys.each {|x| quotes_file.print x+"|"} quotes_file.print "\n" while (line = symbols_file.gets) seconds = (rand()*5).ceil counter += 1 quotes_str = getQuotes(line.chomp) puts "#{counter} + #{quotes_str.split("|").size}" puts quotes_str quotes_file.puts quotes_str sleep seconds end symbols_file.close quotes_file.close system('cp ' + "/home/oracle/stocks/ruby/quotes_" + time_str+ ".csv" + " /home/oracle/stocks/ruby/quotes.csv") system("/home/oracle/stocks/j_stocks.sh") system("/home/oracle/stocks/backup_database.sh")