1 #!/usr/bin/ruby
 2 # tom.luo@gmail.com
 2 # www.oracleabc.com
 3 # v1: 2009-07-24
 4 # v2: 2009-10-11 replaced gsubs with scan
 5 # 1. Save this file as quotes.rb
 6 # 2. Save the symbols.txt
 7 # 3. ./quotes.rb
 8 # 4. It will output quotes.csv
 9
10 require 'open-uri'
11 require 'net/http'
12
13 time = Time.new
14
15 time_str = time.strftime("%Y%m%d")
16
17
18  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"]
19  keys.each {|x| print x+"|"}  
20  puts "\n"
21
22 def getQuotes(symbol)
23   
24   h = Net::HTTP.new('www.google.com')
25   response = h.get('/finance?q='+symbol)
26
27   @quotes_str = symbol + "|"
28   if response.message == "OK"
29      pr = response.body.scan(/class="pr">[\n].*">([0-9]*\.?[0-9]*)<\/span>/)[0].to_a.join
30      chg = response.body.scan(/class="ch bld">.*">([-+]?[0-9]*\.?[0-9]*)<\/span>/)[0].to_a.join
31      chg_pct = response.body.scan(/class="ch[g|r]".*">(\([-+]?[0-9]*\.?[0-9]*%\))<\/span>/)[0].to_a.join
32      hi = response.body.scan(/Range<\/span>\n.*">([0-9]*\.?[0-9]*) - [0-9]*\.?[0-9]*<\/span>/)[0].to_a.join
33      low = response.body.scan(/Range<\/span>\n.*">[0-9]*\.?[0-9]* - ([0-9]*\.?[0-9]*)<\/span>/)[0].to_a.join
34      year_hi = response.body.scan(/52 week<\/span>\n.*">([0-9]*\.?[0-9]*) - [0-9]*\.?[0-9]*<\/span>/)[0].to_a.join
35      year_low = response.body.scan(/52 week<\/span>\n.*">[0-9]*\.?[0-9]* - ([0-9]*\.?[0-9]*)<\/span>/)[0].to_a.join
36      open = response.body.scan(/Open<\/span>\n.*">([0-9]*\.?[0-9]*)<\/span>/)[0].to_a.join
37      vol = response.body.scan(/Vol \/ Avg\.<\/span>\n.*goog-inline-block val">(.*)\/.*<\/span>/)[0].to_a.join
38      avg_vol = response.body.scan(/Vol \/ Avg\.<\/span>\n.*goog-inline-block val">.*\/(.*)<\/span>/)[0].to_a.join
39      mkt_cap = response.body.scan(/Mkt cap<\/span>\n.*goog-inline-block val">(.*)<\/span>/)[0].to_a.join
40      pe = response.body.scan(/P\/E<\/span>\n.*goog-inline-block val">(.*)<\/span>/)[0].to_a.join
41      div = response.body.scan(/Div\/yield<\/span>\n.*goog-inline-block val">(.*)<\/span>/)[0].to_a.join
42      # yld = response.body.scan(/Div\/yield<\/span>\n.*goog-inline-block val">.*\/(.*)<\/span>/)[0].to_a.join
43      eps = response.body.scan(/EPS<\/span>\n.*">([0-9]*\.?[0-9]*)<\/span>/)[0].to_a.join
44      shares = response.body.scan(/Shares<\/span>\n.*goog-inline-block val">(.*)<\/span>/)[0].to_a.join
45      beta = response.body.scan(/Beta<\/span>\n.*">([0-9]*\.?[0-9]*)<\/span>/)[0].to_a.join
46      inst_own = response.body.scan(/Inst. own<\/span>\n.*">([0-9]*\.?[0-9]*%)<\/span>/)[0].to_a.join
47
48 @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 + '|'
49
50     @quotes_str.gsub!(/\&nbsp;\&nbsp;\&nbsp;\&nbsp;-/,"0.0")
51      return @quotes_str
52   end  
53 end
54
55 counter = 0
56 quotes_file = File.open("/home/oracle/stocks/ruby/quotes_"+time_str + ".csv","a")
57 symbols_file = File.new("/home/oracle/stocks/ruby/symbols.txt", "r")
58 keys.each {|x| quotes_file.print x+"|"}
59  quotes_file.print "\n"
60    while (line = symbols_file.gets)
61      seconds =  (rand()*5).ceil
62      counter += 1
63      quotes_str = getQuotes(line.chomp)
64      puts "#{counter} + #{quotes_str.split("|").size}"
65      puts quotes_str
66      quotes_file.puts quotes_str
67      sleep seconds
68    end
69 symbols_file.close
70 quotes_file.close
71
72 system('cp ' + "/home/oracle/stocks/ruby/quotes_" + time_str+ ".csv" + " /home/oracle/stocks/ruby/quotes.csv")
73 system("/home/oracle/stocks/j_stocks.sh")
74 system("/home/oracle/stocks/backup_database.sh")