2010-11-18 4 views
4

J'ai déjà essayé cela. Je suis complètement à court d'idées.Télécharger les prix avec python

Sur cette page, cette boîte de dialogue permet d'insérer des guillemets. http://www.schwab.com/public/schwab/non_navigable/marketing/email/get_quote.html?

J'utilisé SPY, XLV, IBM, MSFT

La sortie est au-dessus d'une table.

Si vous avez un compte, les devis sont en temps réel --- via cookie.

Comment puis-je obtenir la table en python en utilisant 2.6. Les données sous forme de liste ou de dictionnaire

Répondre

4

Premier problème: les données sont en fait dans un iframe dans un cadre; vous devez regarder https://www.schwab.wallst.com/public/research/stocks/summary.asp?user_id=schwabpublic&symbol=APC (où vous remplacez le symbole approprié à la fin de l'URL).

Deuxième problème: extraire les données de la page. Personnellement, j'aime lxml et xpath, mais il y a beaucoup de paquets qui feront l'affaire. Je me attends probablement un code comme

import urllib2 
import lxml.html 
import re 
re_dollars = '\$?\s*(\d+\.\d{2})' 

def urlExtractData(url, defs): 
    """ 
    Get html from url, parse according to defs, return as dictionary 

    defs is a list of tuples ("name", "xpath", "regex", fn) 
     name becomes the key in the returned dictionary 
     xpath is used to extract a string from the page 
     regex further processes the string (skipped if None) 
     fn casts the string to the desired type (skipped if None) 
    """ 

    page = urllib2.urlopen(url) # can modify this to include your cookies 
    tree = lxml.html.parse(page) 

    res = {} 
    for name,path,reg,fn in defs: 
     txt = tree.xpath(path)[0] 

     if reg != None: 
      match = re.search(reg,txt) 
      txt = match.group(1) 

     if fn != None: 
      txt = fn(txt) 

     res[name] = txt 

    return res 

def getStockData(code): 
    url = 'https://www.schwab.wallst.com/public/research/stocks/summary.asp?user_id=schwabpublic&symbol=' + code 
    defs = [ 
     ("stock_name", '//span[@class="header1"]/text()', None, str), 
     ("stock_symbol", '//span[@class="header2"]/text()', None, str), 
     ("last_price", '//span[@class="neu"]/text()', re_dollars, float) 
     # etc 
    ] 
    return urlExtractData(url, defs) 

Quand appelé

print repr(getStockData('MSFT')) 

retourne

{'stock_name': 'Microsoft Corp', 'last_price': 25.690000000000001, 'stock_symbol': 'MSFT:NASDAQ'} 

Troisième problème: le balisage sur cette page de présentation, et non structurelle - qui dit moi que le code basé sur il sera probablement fragile, à savoir tout changement à la structure de la page (ou la variation entre les pages) nécessitera de retravailler vos xpaths.

Espérons que ça aide!

+0

@hugh Je voudrais obtenir les données de cette page. Ensuite, utilisez les nouvelles compétences trouvées et le code pour les autres pages, Merci pour les idées. Il n'y a aucun moyen de scaper cette page. Ajoutez l'authentification et obtenez des données en temps réel. J'ai seulement besoin des données présentées. La liste sybmol 50+ .... Encore une fois, merci beaucoup pour vos efforts. J'ai besoin d'apprendre comment scape cette page ...... – Merlin

+0

Son complètement cassé, maintenant que j'ai commencé à utiliser lxml, pouvez-vous me dire comment vous l'avez réparé, si vous le corrigez. – Merlin

+0

@ user428862: en quoi est-il "complètement cassé"? Le code ci-dessus semble toujours fonctionner pour moi. –

5

Utilisez quelque chose comme Beautiful Soup pour analyser la réponse HTML du site Web et la charger dans un dictionnaire. utilisez le symbole comme clé et un tuple de toutes les données qui vous intéressent en tant que valeur. Itérer sur tous les symboles renvoyés et ajouter une entrée par symbole.

Vous pouvez voir des exemples de la façon de le faire dans «Programming Collective Intelligence» de Toby Segaran. Les échantillons sont tous en Python.

+0

Merci, je ne savais pas de cette source. Savez-vous où dans le livre, mon sujet est traité. Je suis un noob à ceci. – Merlin

+0

Comment utiliser Beautiful Soup avec les URL ci-dessus. Tout code? – Merlin

+0

Voir le chapitre 3: Découvrir les groupes. – duffymo

3

Avez-vous pensé à utiliser les guillemets de yahoo?
voir: http://developer.yahoo.com/yql/console/?q=show%20tables&env=store://datatables.org/alltableswithkeys#h=select%20 *% 20from% 20yahoo.finance.quotes% 20Lorsque% 20symbol% ​​20%% en 3D 20% 22YHOO% 22

Vous serez en mesure de générer dynamiquement une requête au site Web tel que:
http://query.yahooapis.com/v1/public/yql?q=select%20 *% 20from% 20yahoo.finance.quotes% 20Lorsque% 20symbol% ​​20% 3D% 20% 22% 22YHOO & diagnostic = true & env = mémorisez% 3A% 2F% 2Fdatatables.org% 2Falltableswithkeys

Et sondage avec standard une requête http GET. La réponse est au format XML.

+0

J'ai des données de Yahoo en cours d'exécution. J'utilise cvs download parse dans la table. Je ne suis pas qualifié avec Http Get et le format XML. – Merlin

+0

Un http get est une requête http standard que vous faites avec votre navigateur. Utilisez httplib2, l'objet http.request (the_url, "GET") et vous obtiendrez une réponse avec le XML pour analyser. Utiliser ceci et xml ne nécessite pas de compétence, mais si vous voulez connaître l'abc du web, vous devriez peut-être y jeter un coup d'oeil. Puisque le XML n'est que du texte, analysez-le et faites correspondre les informations que vous voulez dans vos objets logiques et le travail accompli. –

0

matplotlib dispose d'un module qui obtient des citations historiques de Yahoo:

>>> from matplotlib.finance import quotes_historical_yahoo 
>>> from datetime import date 
>>> from pprint import pprint 
>>> pprint(quotes_historical_yahoo('IBM', date(2010, 11, 12), date(2010, 11, 18))) 
[(734088.0, 
    144.59, 
    143.74000000000001, 
    145.77000000000001, 
    143.55000000000001, 
    4731500.0), 
(734091.0, 
    143.88999999999999, 
    143.63999999999999, 
    144.75, 
    143.27000000000001, 
    3827700.0), 
(734092.0, 
    142.93000000000001, 
    142.24000000000001, 
    143.38, 
    141.18000000000001, 
    6342100.0), 
(734093.0, 
    142.49000000000001, 
    141.94999999999999, 
    142.49000000000001, 
    141.38999999999999, 
    4785900.0)] 
+0

Merci Im vraiment essayer d'obtenir les données d'un courtier. J'ai besoin de prix intraday. – Merlin