class Google(Logger): url_symbol="http://www.google.com/finance?noIL=1&%s" url_quote="http://www.google.com/finance/info?infotype=infoquoteall&%s" fields = {\ 'avvo':'average_volume', 'beta':'beta', 'c':'current_volume', 'ccol':'unknow', 'cl':'last_change_prc', 'cp':'last_change_p', 'e':'echange', 'ec':'after_hour_change_prc', 'eccol':'unknonw', 'el':'after_hour_last_price', 'el_cur': 'unknown', 'elt':'after_hour_last_quote_time', 'eo':'exchange_open', 'eps':'eps', 'fwpe': 'forward_pe', 'hi': 'high', 'hi52': '52wk_high', 'id':'id_number', 'l':'last', 'lo':'low', 'lo52':'52wk_low', 'lt':'last_quote_time', 'ltt':'last_trade_time', 'mc':'mkt_cap', 'name':'name', 'op':'open_price', 'pe':'pe_ratio', 't':'ticker', 'vo':'volume'} def __init__(self, persist = 24*3600, cachefile=".cacheurl.db" ): Logger.__init__(self) self.cache = CacheUrl( cachefile=cachefile, persist=persist ) def search_symbol(self, phrase, headn=None): # return google symbols for query phrase, may return more than 1 result! # @param phrase: string submitted to google.finance # @param headn: limit number of answer. If 1, just return a string, not # a list phrase = phrase.rstrip() url = self.url_symbol % urllib.urlencode( {'q':phrase } ) bs = BeautifulSoup( self.cache.perform_request( url ) ) nodes = bs.findAll( 'td', {'class':re.compile('localName.*')} ) nodes = [ n.find('a') for n in nodes ] nodes = [ n for n in nodes if n ] links = [ n['href'].split('q=') for n in nodes if n.has_key('href') ] syms = [ s[-1] for s in links if len(s)==2 ] return qutils.head_list( syms, headn ) def _get_quotes_raw(self, symbols): url = self.url_quote % urllib.urlencode({'q':','.join(symbols)}) raw_data = self.cache.perform_request( url ).\ replace('\n','').strip('\n/ ') try: data = cjson.decode(raw_data) except Exception, e: self.logger.error( str(e) ) self.logger.error( "cjson parsing Google._get_quotes_raw failed") self.logger.error( "current raw_data : %s "% raw_data ) data = None return( data )
class Yahoo(Logger): url_symbol = "http://d.yimg.com/autoc.finance.yahoo.com/autoc?%s" url_yql = "http://query.yahooapis.com/v1/public/yql?q=select"+\ "%20%2A%20from%20__table__%20where%20symbol"+\ "%20in%20(__group__)%0A%09%09&format=json&diagnostics=false"+\ "&env=http%3A%2F%2Fdatatables.org%2"+\ "Falltables.env&callback=cbfunc" def __init__(self, persist=24*3600, cachefile=".cacheurl.db"): Logger.__init__(self) self.cache = CacheUrl(persist=persist, cachefile=cachefile) def search_symbol(self, phrase, headn=None ): callback = "YAHOO.Finance.SymbolSuggest.ssCallback" url = self.url_symbol % urllib.urlencode({\ 'query' : phrase.strip(), 'callback' : callback }) html = self.cache.perform_request( url ).\ replace(callback,'').strip(')(') data = cjson.decode(html)['ResultSet']['Result'] symbols = [ d['symbol'] for d in data ] return( qutils.head_list( symbols, headn )) def _get_select_raw( self, table, group=None): # generic call to yahoo YQL table if group: group = ",".join([ '"%s"' % s for s in group]) url = self.url_yql.replace('__table__', table) if group: url = url.replace('__group__', group ) raw_data = self.cache.perform_request(url) try: raw_data = raw_data.replace('cbfunc','').strip(')(;') data = cjson.decode( raw_data )['query']['results'].values()[0] # if one result only, let the result be homoeneous # with other classes if not isinstance(data, list): data = [data] except Exception, e: self.logger.error( str(e) ) self.logger.error("cjson parsing Yhaoo._get_quotes_raw failed" ) self.logger.error("current raw_data : %s" % raw_data ) return data
def __init__(self, persist = 24*3600, cachefile=".cacheurl.db" ): Logger.__init__(self) self.cache = CacheUrl( cachefile=cachefile, persist=persist )