Je suis assez nouveau dans la programmation en Python .
Je souhaite créer une application qui récupère les cours des actions auprès de google finance . Un exemple est CSCO (Cisco Sytems). J'utiliserais alors ces données pour avertir l'utilisateur lorsque le stock atteint une certaine valeur . Il doit également se rafraîchir toutes les 30 secondes .
Le problème est que je n'ai aucune idée de comment récupérer les données!
Quelqu'un a des idées?
Ce module est fourni par Corey Goldberg .
Programme:
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
Exemple d'utilisation:
import stockquote
print stockquote.get_quote('goog')
Mise à jour : modification de l'expression régulière pour qu'elle corresponde au dernier format de Google Finance (au 23 février 2011). Cela démontre le principal problème lorsque l'on se fie au grattage d'écran.
Pour l'instant (2015), l'API google finance est obsolète. Mais vous pouvez utiliser le module pypi googlefinance .
Installez googlefinance
$pip install googlefinance
Il est facile d'obtenir le cours actuel des actions:
>>> 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 est une source qui fournit des données boursières en temps réel. Il existe également d'autres API de yahoo, telles que yahoo-finance , mais elles sont retardées de 15 minutes pour les actions du NYSE et du NASDAQ.
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
Je trouve que si vous utilisez ref _ (. *?) Et utilisez m.group (2), vous obtiendrez un meilleur résultat lorsque l'ID de référence change de stock en stock.
Je suggère d'utiliser le HTMLParser pour obtenir la valeur des balises meta google places dans son 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" />
Avec un code comme celui-ci:
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
Juste au cas où vous souhaiteriez extraire des données de Yahoo ... Voici une fonction simple. Cela ne supprime pas les données d'une page normale. Je pensais avoir un lien vers la page décrivant cela dans les commentaires, mais je ne le vois pas maintenant - il y a une chaîne magique ajoutée à l'URL pour demander des champs spécifiques.
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
Ici, j'ai trouvé le lien qui décrit la chaîne magique: http://cliffngan.net/a/1
http://docs.python.org/library/urllib.html pour récupérer des URL arbitraires.
En dehors de cela, vous devriez mieux regarder un service Web fournissant les données au format JSON.
Sinon, vous devez implémenter vous-même l'analyse, etc.
Capture d'écran de yahoo.com pour obtenir les stocks est peu probable que la bonne voie vers le succès.
Vous pouvez commencer par regarder les API Google Finance , même si je ne vois pas d'API ou de wrapper Python). Il semble que les seules options pour accéder directement aux données are Java et JavaScript. Vous pouvez également tilisez cURL si vous le connaissez et qu'il est disponible sur votre système.
L'API de Google Finance est un autre bon point de départ: http://code.google.com/apis/finance/ Vous pouvez consulter leur gadgets financiers pour un exemple de code .