2011-02-22 12 views
12

Soy bastante nuevo en la programación en Python.Cómo crear una aplicación de búsqueda de cotizaciones en python

Quiero hacer una aplicación que obtendrá obtener precios de acciones de google finance. Un ejemplo es CSCO (Cisco Sytems). Entonces utilizaría esa información en para avisar al usuario cuando la población alcance un cierto valor. También necesita actualizar cada 30 segundos.

¡El problema es que no tengo ni idea de cómo recuperar los datos!

¿Alguien tiene alguna idea?

Respuesta

15

Este módulo viene cortesía de Corey Goldberg.

Programa:

import urllib 
import re 

def get_quote(symbol): 
    base_url = 'http://finance.google.com/finance?q=' 
    content = urllib.urlopen(base_url + symbol).read() 
    m = re.search('id="ref_694653_l".*?>(.*?)<', content) 
    if m: 
     quote = m.group(1) 
    else: 
     quote = 'no quote available for: ' + symbol 
    return quote 

Ejemplo de uso:

import stockquote 
print stockquote.get_quote('goog') 

actualización: Se ha cambiado la expresión regular para que coincida con formato más reciente de Google Finanzas (al 23-Feb-2011). Esto demuestra el problema principal cuando se basa en el raspado de la pantalla.

+0

Simplemente copie y pegue este código. Pero la salida dice 'sin cita disponible para: goog'. – Dharmit

+0

Gracias Dharmit. No he usado este código por un tiempo, pero tiene razón: Google Finance tiene un nuevo formato de salida. Actualicé el código y ahora debería funcionar. –

+0

Funciona como el encanto. Gracias por el código. :) – Dharmit

0

http://docs.python.org/library/urllib.html para buscar URL arbitrarias.

Aparte de eso, debería buscar un servicio web que proporcione los datos en formato JSON.

De lo contrario, tiene que implementar el análisis sintáctico, etc., por su cuenta.

Screenscrapping yahoo.com para obtener las acciones es poco probable que el camino correcto para el éxito.

0

Puede comenzar mirando el Google Finance APIs, aunque no veo una API o contenedor Python. Parece que las únicas opciones para acceder a los datos directamente son Java y JavaScript. También puede llamar al use cURL si está familiarizado con él y está disponible en su sistema.

1

En caso de que desee extraer datos de Yahoo ... Aquí tiene una función simple. Esto no elimina datos de una página normal. Pensé que tenía un enlace a la página que describía esto en los comentarios, pero ahora no lo veo; hay una cadena mágica adjunta a la URL para solicitar campos específicos.

import urllib as u 
import string 
symbols = 'amd ibm gm kft'.split() 

def get_data(): 
    data = [] 
    url = 'http://finance.yahoo.com/d/quotes.csv?s=' 
    for s in symbols: 
     url += s+"+" 
    url = url[0:-1] 
    url += "&f=sb3b2l1l" 
    f = u.urlopen(url,proxies = {}) 
    rows = f.readlines() 
    for r in rows: 
     values = [x for x in r.split(',')] 
     symbol = values[0][1:-1] 
     bid = string.atof(values[1]) 
     ask = string.atof(values[2]) 
     last = string.atof(values[3]) 
     data.append([symbol,bid,ask,last,values[4]]) 
    return data 

Aquí, he encontrado el enlace que describe la cadena mágica: http://cliffngan.net/a/13

+1

También hay un buscador de datos de Yahoo integrado en la biblioteca de Python Pandas ([link] (http://www.statalgo.com/2011/09/08/pandas-getting-financial-data-from-yahoo-fred- etc /)) (y los datos de la Reserva Federal y Fama/francés también son bibliotecarios). Las especificaciones actuales pueden quedar obsoletas a favor de un sistema de consulta de datos más robusto, pero creo que Pandas es el camino a seguir para esto. – ely

2
import urllib 
import re 

def get_quote(symbol): 
    base_url = 'http://finance.google.com/finance?q=' 
    content = urllib.urlopen(base_url + symbol).read() 
    m = re.search('id="ref_(.*?)">(.*?)<', content) 
    if m: 
     quote = m.group(2) 
    else: 
     quote = 'no quote available for: ' + symbol 
    return quote 

Me parece que si se utiliza ref _ y utilizar m.group (2) se quiere (*.?) Obtenga un mejor resultado a medida que la identificación de referencia cambia de stock a stock.

2

sugiere emplear la HTMLParser para obtener el valor de las etiquetas meta de google lugares en los que es html

<meta itemprop="name" 
     content="Cerner Corporation" /> 
<meta itemprop="url" 
     content="https://www.google.com/finance?cid=92421" /> 
<meta itemprop="imageUrl" 
     content="https://www.google.com/finance/chart?cht=g&q=NASDAQ:CERN&tkr=1&p=1d&enddatetime=2014-04-09T12:47:31Z" /> 
<meta itemprop="tickerSymbol" 
     content="CERN" /> 
<meta itemprop="exchange" 
     content="NASDAQ" /> 
<meta itemprop="exchangeTimezone" 
     content="America/New_York" /> 
<meta itemprop="price" 
     content="54.66" /> 
<meta itemprop="priceChange" 
     content="+0.36" /> 
<meta itemprop="priceChangePercent" 
     content="0.66" /> 
<meta itemprop="quoteTime" 
     content="2014-04-09T12:47:31Z" /> 
<meta itemprop="dataSource" 
     content="NASDAQ real-time data" /> 
<meta itemprop="dataSourceDisclaimerUrl" 
     content="//www.google.com/help/stock_disclaimer.html#realtime" /> 
<meta itemprop="priceCurrency" 
     content="USD" /> 

Con código como este:

import urllib 
try: 
    from html.parser import HTMLParser 
except: 
    from HTMLParser import HTMLParser 

class QuoteData: 
    pass 

class GoogleFinanceParser(HTMLParser): 
    def __init__(self): 
     HTMLParser.__init__(self) 
     self.quote = QuoteData() 
     self.quote.price = -1 

    def handle_starttag(self, tag, attrs): 
     if tag == "meta": 
      last_itemprop = "" 
      for attr, value in attrs: 
       if attr == "itemprop": 
        last_itemprop = value 

       if attr == "content" and last_itemprop == "name": 
        self.quote.name = value 
       if attr == "content" and last_itemprop == "price": 
        self.quote.price = value 
       if attr == "content" and last_itemprop == "priceCurrency": 
        self.quote.priceCurrency = value 
       if attr == "content" and last_itemprop == "priceChange": 
        self.quote.priceChange = value 
       if attr == "content" and last_itemprop == "priceChangePercent": 
        self.quote.priceChangePercent = value 
       if attr == "content" and last_itemprop == "quoteTime": 
        self.quote.quoteTime = value 
       if attr == "content" and last_itemprop == "exchange": 
        self.quote.exchange = value 
       if attr == "content" and last_itemprop == "exchangeTimezone": 
        self.quote.exchangeTimezone = value 


def getquote(symbol): 
    url = "http://finance.google.com/finance?q=%s" % symbol 
    content = urllib.urlopen(url).read() 

    gfp = GoogleFinanceParser() 
    gfp.feed(content) 
    return gfp.quote; 


quote = getquote('CSCO') 
print quote.name, quote.price 
13

Por el momento (2015), el Google La API api está en desuso. Pero puede usar el módulo pypi googlefinance.

Instalar GoogleFinance

$pip install googlefinance 

Es fácil de conseguir actual precio de las acciones:

>>> from googlefinance import getQuotes 
>>> import json 
>>> print json.dumps(getQuotes('AAPL'), indent=2) 
[ 
    { 
    "Index": "NASDAQ", 
    "LastTradeWithCurrency": "129.09", 
    "LastTradeDateTime": "2015-03-02T16:04:29Z", 
    "LastTradePrice": "129.09", 
    "Yield": "1.46", 
    "LastTradeTime": "4:04PM EST", 
    "LastTradeDateTimeLong": "Mar 2, 4:04PM EST", 
    "Dividend": "0.47", 
    "StockSymbol": "AAPL", 
    "ID": "22144" 
    } 
] 

Google Finance es una fuente que proporciona los datos de stock en tiempo real. También hay otras API de Yahoo, como yahoo-finance, pero se retrasan 15 minutos para las acciones de NYSE y NASDAQ.

Cuestiones relacionadas