python scrapy yahoo-finance

python - ¿Cómo obtener los datos históricos del precio máximo de las finanzas de yahoo?



python fix yahoo finance (4)

después de instalar pandas datareader con:

pip install pandas-datareader

Puede solicitar los precios de las acciones con este código:

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''])

Quiero obtener los datos de precios históricos máximos con scrapy de Yahoo Finance.
Aquí está la url de los datos históricos de precios máximos de fb (facebook).

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

Para escribir un rastreador web de precios de acciones, dos problemas que no puedo resolver.
1.¿Cómo obtener el argumento period1?
Puede obtenerlo a mano en la página web, solo para hacer clic en max.
¿Cómo obtener el argumento con los códigos python?
Las existencias diferentes tienen el valor de period1 diferente.

2.¿Cómo crear el argumento migmb = 1qRuQKELxmM automáticamente, diferentes stocks con diferente valor de miga?
Aquí está mi stock de datos históricos máximos con el marco de 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

¿Cómo llenar el espacio en blanco arriba en mi marco web de garabatos?


Si lo que desea es el historial completo, realmente no necesita calcular la fecha máxima, use una fecha antigua razonable (en el ejemplo siguiente 1900/01/01). Por ejemplo, asumamos que usted está interesado en las acciones de FB , entonces esto debería funcionar

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])


  1. Tanto period1 como period2 son valores de "segundos desde época" y puede convertir entre marcas de tiempo de python y esos valores utilizando datetime.datetime.fromtimestamp(dt) e int(dt.timestamp()) . Pero como otros ya lo mencionaron, no necesita especificar números exactos para estos parámetros, puede usar cero para el período 1 y 2000000000 para el período 2 para todas las existencias.

  2. Es importante que el mismo valor de "migajas" sea válido para descargar todas las existencias durante un tiempo (alrededor de 1 semana). Por lo tanto, en lugar de obtener una nueva "migaja" antes de cada solicitud de descarga, debe almacenarla en caché y actualizar solo si obtiene la respuesta "No autorizada"; tus descargas se ejecutarán dos veces más rápido. La forma más sencilla de obtener el valor de la miga es solicitar la página principal de Yahoo ( https://finance.yahoo.com/ ) y buscar "usuario": {"migaja": "substring there".


Según tengo entendido, desea descargar todos los datos posibles para un ticker específico. Por lo tanto, para hacer esto, en realidad no necesita proporcionar el parámetro period1 si proporciona 0 en lugar de period1 entonces Yahoo API pone como predeterminada la fecha más antigua.

Para descargar las cotizaciones utilizando la forma que mostró en la pregunta, desafortunadamente tenemos que ocuparnos de las cookies. Me permitiré proporcionar una solución sin usar Scrapy, solo se requiere un ticker en sí mismo:

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 realmente necesita la fecha más antigua, puede usar el código anterior y extraer la primera fecha de la respuesta.

Referencia

Editar

Sé que el web scraping no es una opción eficiente, pero es la única opción que tenemos porque Yahoo ya retiró todas las API. Es posible que encuentre alguna solución de terceros, pero todos utilizan el raspado dentro de su código fuente y agregan algunas transformaciones adicionales a los datos que disminuyen la eficiencia general.