class QuickTicker::Scraper
Attributes
browser[RW]
cli[RW]
gfs_noko_html[RW]
stock[RW]
Public Class Methods
new(cli)
click to toggle source
# File lib/scraper.rb, line 7 def initialize(cli) self.cli = cli self.browser = Watir::Browser.new(:phantomjs) end
Public Instance Methods
create_stock(symbol)
click to toggle source
# File lib/scraper.rb, line 31 def create_stock(symbol) data = package_stock(symbol) QuickTicker::Stock.new(data) end
gfs_url(symbol)
click to toggle source
# File lib/scraper.rb, line 12 def gfs_url(symbol) "https://www.google.com/finance?q=" + symbol end
load_gfs(symbol, fixture_url = nil)
click to toggle source
Returns an array. Array is a stock if one was succesfully created and nil otherwise. Array indicates whether the symbol cooresponds to a mutual fund.
# File lib/scraper.rb, line 23 def load_gfs(symbol, fixture_url = nil) fixture_url.nil? ? load_gfs_noko_html(self.gfs_url(symbol)) : load_gfs_noko_html(fixture_url) return [nil, true] unless self.gfs_noko_html.text.match('\(MUTF:').nil? return [nil, false] if self.gfs_noko_html.css("span.pr").text.strip == "" # checks whether the page lists a price # return [nil, false] if self.gfs_noko_html.css("div.fjfe-content").text.include?("- produced no matches.") [self.create_stock(symbol), false] end
load_gfs_noko_html(url)
click to toggle source
# File lib/scraper.rb, line 16 def load_gfs_noko_html(url) browser.goto(url) self.gfs_noko_html = Nokogiri::HTML(browser.html) end
nil_to_empty_str(data_hash)
click to toggle source
convert any nil values to empty strings to avoid exceptions
# File lib/scraper.rb, line 106 def nil_to_empty_str(data_hash) data_hash.each do |key, value| data_hash[key] = "" if data_hash[key].nil? end end
package_stock(symbol)
click to toggle source
# File lib/scraper.rb, line 36 def package_stock(symbol) data = {} data[:stock] = self.scrape_stock(symbol) data[:quote] = self.scrape_stock_quote data[:description] = self.scrape_stock_description data[:related_companies] = self.scrape_stock_related_companies data end
scrape_stock(symbol)
click to toggle source
# File lib/scraper.rb, line 45 def scrape_stock(symbol) data = {} data[:symbol] = symbol begin data[:name] = self.gfs_noko_html.css("div.g-first a").text.match('(?<=All news for )[\w,.)() ]*(?= »)')[0] rescue NoMethodError data[:name] = "" end data[:exchange] = self.gfs_noko_html.css("span.dis-large").text.split("\n")[0] nil_to_empty_str(data) end
scrape_stock_description()
click to toggle source
# File lib/scraper.rb, line 77 def scrape_stock_description data = {} data[:sector] = self.gfs_noko_html.css("a#sector").text data[:industry] = self.gfs_noko_html.css("a#sector+a").text data[:summary] = self.gfs_noko_html.css("div.companySummary").text.gsub("More from Reuters »", "").strip nil_to_empty_str(data) end
scrape_stock_quote()
click to toggle source
# File lib/scraper.rb, line 57 def scrape_stock_quote data = {} data[:price] = self.gfs_noko_html.css("span.pr").text.strip data[:change] = self.gfs_noko_html.css("div.nwp span.bld").text.split("\n")[0] begin data[:change_pct] = self.gfs_noko_html.css("div.nwp span.bld").text.split("\n")[1].gsub(/[)(]/, '').chomp("%") rescue NoMethodError data[:change_pct] = "" end data[:range] = self.gfs_noko_html.css("td[data-snapfield='range']+td").text.strip data[:range_yr] = self.gfs_noko_html.css("td[data-snapfield='range_52week']+td").text.strip data[:open] = self.gfs_noko_html.css("td[data-snapfield='open']+td").text.strip data[:volume] = self.gfs_noko_html.css("td[data-snapfield='vol_and_avg']+td").text.strip.split("/")[0] data[:volume_avg] = self.gfs_noko_html.css("td[data-snapfield='vol_and_avg']+td").text.strip.split("/")[1] data[:mkt_cap] = self.gfs_noko_html.css("td[data-snapfield='market_cap']+td").text.strip data[:pe_ttm] = self.gfs_noko_html.css("td[data-snapfield='pe_ratio']+td").text.strip data[:div_yld] = self.gfs_noko_html.css("td[data-snapfield='latest_dividend-dividend_yield']+td").text.strip.split("/")[1] nil_to_empty_str(data) end