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])
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)
eint(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.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.
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.