2017-10-20 39 views
3

Je veux obtenir les données de prix historiques max avec scrapy de yahoo finance.
Voici l'URL des données de prix historique fb (facebook) max.Comment obtenir les données de prix historiques max de yahoo finance?

https://query1.finance.yahoo.com/v7/finance/download/FNMA?period1=221115600&period2=1508472000&interval=1d&events=history&crumb=1qRuQKELxmM 

Afin d'écrire un crawler web prix des prix, deux problèmes que je ne peux pas résoudre.
1.Comment obtenir l'argument period1?
Vous pouvez l'obtenir à la main dans la page Web, il suffit de cliquer sur max.
Comment obtenir l'argument avec les codes python?
Le stock différent a la valeur period1 différente.

enter image description here

2.How pour créer la mie argument = 1qRuQKELxmM automatiquement, des actions différentes avec différentes valeurs de la mie?
Voici mes données historiques max stock avec cadre scrapy.

import scrapy 

class TestSpider(scrapy.Spider): 
    name = "quotes" 
    allowed_domains = ["finance.yahoo.com"] 

    def __init__(self, *args, **kw): 
     self.timeout = 10 

    def start_requests(self): 
     stockName = get-it and ommit the codes 
     for stock in stockName: 
      period1 = how to fill it 
      crumb = how to fill it 
      per_stock_max_data = "https://query1.finance.yahoo.com/v7/finance\ 
        download/"+stock+"?period1="+period1+"&period2=1508472000&\ 
        interval=1d&events=history&"+"crumb="crumb 
      yield scrapy.Request(per_stock_max_data,callback=self.parse) 

    def parse(self, response): 
     content = response.body 
     target = response.url 
     #do something 

Comment remplir le blanc ci-dessus dans mon framework de scrawler Web?

+0

Avez-vous envisagé d'utiliser pandas géants – Dark

+0

pandas géants Wiht, tel code est besoin de 'start = datetime.datetime (2010, 1, 1)', stock différent a différent date de début, le problème demeure –

+0

[This] (http://blog.bradlucas.com/posts/2017-06-02 -new-yahoo-finance-quote-download-url /) lien peut vous être utile car il montre comment obtenir la valeur 'crumb' –

Répondre

2

après l'installation datareader de pandas géants avec:

pip install pandas-datareader 

Vous pouvez demander les cours des actions avec ce code:

import pandas_datareader as pdr 
from datetime import datetime 

appl = pdr.get_data_yahoo(symbols='AAPL', start=datetime(2000, 1, 1), end=datetime(2012, 1, 1)) 
print(appl['Adj Close']) 
+0

Comment créer le' start = datetime' automatiquement, stock différent avec différents value –

+0

Vous mettez la date dans datetime que vous souhaitez demander et vous mettez le code de stock dans les symboles ... – mrCarnivore

+0

Vous ne pouvez pas construire un Web crawler à la main. –

4

Si je comprends bien, vous voulez télécharger toutes les données possibles pour un symbole spécifique. Donc, pour ce faire, vous n'avez pas besoin de fournir le paramètre period1 si vous fournissez 0 à la place de period1, puis Yahoo API met par défaut la date la plus ancienne.

Pour télécharger des citations en utilisant la façon dont vous avez montré dans la question, nous avons malheureusement affaire à des cookies. Je me laisserai fournir une solution sans utiliser Scrapy, seul symbole lui-même est nécessaire:

import re 
import time 
import requests 

def get_yahoo_ticker_data(ticker): 
    res = requests.get('https://finance.yahoo.com/quote/' + ticker + '/history') 
    yahoo_cookie = res.cookies['B'] 
    yahoo_crumb = None 
    pattern = re.compile('.*"CrumbStore":\{"crumb":"(?P<crumb>[^"]+)"\}') 
    for line in res.text.splitlines(): 
     m = pattern.match(line) 
     if m is not None: 
      yahoo_crumb = m.groupdict()['crumb'] 
    cookie_tuple = yahoo_cookie, yahoo_crumb 

    current_date = int(time.time()) 
    url_kwargs = {'symbol': ticker, 'timestamp_end': current_date, 
     'crumb': cookie_tuple[1]} 
    url_price = 'https://query1.finance.yahoo.com/v7/finance/download/' \ 
       '{symbol}?period1=0&period2={timestamp_end}&interval=1d&events=history' \ 
       '&crumb={crumb}'.format(**url_kwargs) 


    response = requests.get(url_price, cookies={'B': cookie_tuple[0]}) 

Si vous avez vraiment besoin de la date la plus ancienne, vous pouvez utiliser le code ci-dessus et extraire la première date de la réponse.

Reference

Modifier

je sais que racler web est pas une option efficace mais il est la seule option que nous avons parce que Yahoo déjà retiré toutes les API. Vous pouvez trouver une solution tierce, mais tous utilisent le code source dans leur code source et ajoutent des transformations supplémentaires aux données, ce qui réduit l'efficacité globale.

0

Si ce que vous voulez est l'historique complet, vous n'avez pas vraiment besoin de calculer la date max, utilisez une ancienne date raisonnable (dans l'exemple ci-dessous 1900/01/01).Par exemple, supposons que vous êtes intéressé en stock de FB, alors cela devrait fonctionner

import scrapy 
import time 


class FinanceSpider(scrapy.Spider): 
    name = "finance" 
    allowed_domains = ["finance.yahoo.com"] 
    start_urls = ['https://finance.yahoo.com/quote/FB'] 

    def parse(self, response): 
     crumb = response.css('script').re_first('user":{"crumb":"(.*?)"').decode('unicode_escape') 
     url = ("https://query1.finance.yahoo.com/v7/finance/download/FB" + 
       "?period1=-2208988800&period2=" + str(int(time.time())) + "&interval=1d&events=history&" + 
       "crumb={}".format(crumb)) 
     return scrapy.Request(url, callback=self.parse_csv) 

    def parse_csv(self, response): 
     lines = response.body.strip().split('\n') 
     print(lines[0]) 
     print(lines[1]) 
     print(lines[-1]) 
+0

Quelque chose ne va pas dans vos codes, s'il vous plaît le tester. –

+0

Je l'ai fait, pourriez-vous s'il vous plaît dites-moi quel message d'erreur recevez-vous?, Il fonctionne bien avec python 2.7 et scrapy 1.3.3 – Wilfredo

+0

Pourriez-vous télécharger les paramètres de votre projet? Peut-être qu'il y a une configuration manquante. – Wilfredo

0
  1. Les deux period1 et période2 sont des valeurs « secondes depuis d'époque » et vous pouvez convertir entre horodatages python et ces valeurs à l'aide et int(dt.timestamp()). Mais comme d'autres déjà mentionné, vous n'avez pas besoin de spécifier des nombres exacts pour ces paramètres, vous pouvez utiliser zéro pour période1 et 2000000000 pour période2 pour tous les stocks.

  2. Important que la même valeur "miettes" est valable pour le téléchargement de tous les stocks pendant un certain temps (environ 1 semaine). Ainsi, au lieu d'obtenir une nouvelle "miette" avant chaque demande de téléchargement, vous devriez la mettre en cache et mettre à jour seulement si vous obtenez une réponse "non autorisée"; vos téléchargements s'exécuteront deux fois plus vite. La meilleure façon d'obtenir la valeur de la mie est de demander la page principale Yahoo (https://finance.yahoo.com/) et trouver « utilisateur »: { « miette ».? » Sous-chaîne il