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!(/\ \ \ \ -/,"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")