示例#1
0
文件: google.py 项目: RedRise/quoter
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 )
示例#2
0
文件: yahoo.py 项目: RedRise/quoter
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
示例#3
0
文件: google.py 项目: RedRise/quoter
 def __init__(self, persist = 24*3600, cachefile=".cacheurl.db" ):
     Logger.__init__(self)
     self.cache = CacheUrl( cachefile=cachefile, persist=persist )