如何从雅虎财经获取最高历史价格数据?
我想从雅虎财经获得scrapy的最高历史价格数据。
这里是fb(facebook)最大历史价格数据的网址。如何从雅虎财经获取最高历史价格数据?
https://query1.finance.yahoo.com/v7/finance/download/FNMA?period1=221115600&period2=1508472000&interval=1d&events=history&crumb=1qRuQKELxmM
为了写一个股票价格的网络爬虫,我不能解决两个问题。
1.如何获得参数period1?
您可以在网页上手动获取,只需点击最大。
如何获得python代码参数?
不同的股票有不同的period1值。
2.How创建参数碎屑= 1qRuQKELxmM自动,不同的股票具有不同屑值?
这是我的股票最大历史数据与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
如何填写上面的空白在我的网页scrawler框架?
安装熊猫DataReader的使用后:
pip install pandas-datareader
您可以请求股价与此代码:
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'])
如何自动创建'start = datetime',不同的股票有不同的值 –
您将日期放入您要请求的日期时间,并将股票代码放入符号中... – mrCarnivore
您无法构建手动网络爬虫。 –
据我了解您想要下载的所有可能的数据为特定的股票。所以要做到这一点,如果你提供0代替period1
,那么你实际上不需要提供period1
参数,那么雅虎API默认为最早的日期。
要使用您在问题中显示的方式下载报价,我们不得不处理cookies。我将让自己提供的解决方案,而无需使用Scrapy,只有股票需要自己:
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]})
如果你真的需要的最早日期,那么你可以使用上面的代码,并从中提取响应的第一天。
编辑
我确实知道,网页抓取是不是一个有效的选项,但是这是我们必须因为雅虎已经撤出所有API的唯一选择。您可能会发现一些第三方解决方案,但所有这些解决方案都在他们的源代码中使用了scraping,并且为数据添加了一些额外的转换,从而降低了整体效率。
如果你想要的是整个历史,你真的不需要计算最大日期,使用合理的旧日期(在1900/01/01以下的例子中)。例如,让我们假设你有兴趣FB
的股票,那么这应该工作
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和间隔2是‘纪元以来的秒数’值,你可以使用python时间戳和这些值之间进行转换
datetime.datetime.fromtimestamp(dt)
和int(dt.timestamp())
。但是正如其他人已经提到的那样,您不需要为这些参数指定确切的数字,对于所有股票,您可以对period1使用零,对period2使用2000000000。重要的是,相同的“crumb”值适用于下载所有股票一段时间(大约1周)。因此,不要在每次下载请求之前获得新的“碎屑”,只有在得到“未经授权”响应时才应该缓存并更新;您的下载速度会提高两倍。拿到面包屑值最简单的方法是要求雅虎主页(https://finance.yahoo.com/),找到“用户”:{“面包屑”:?”串有
你有没有考虑过用熊猫 – Dark
室内用大熊猫,这样的代码是需要'start = datetime.datetime(2010,1,1)',不同的股票有不同的开始日期时间,问题依旧。 –
[This](http://blog.bradlucas.com/posts/2017-06-02) -new-yahoo-finance-quote-download-url /)链接可能对你有帮助,因为它显示了如何获得'crumb'值。 –