如何从雅虎财经获取最高历史价格数据?

问题描述:

我想从雅虎财经获得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值。

enter image description here

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框架?

+0

你有没有考虑过用熊猫 – Dark

+0

室内用大熊猫,这样的代码是需要'start = datetime.datetime(2010,1,1)',不同的股票有不同的开始日期时间,问题依旧。 –

+0

[This](http://blog.bradlucas.com/posts/2017-06-02) -new-yahoo-finance-quote-download-url /)链接可能对你有帮助,因为它显示了如何获得'crumb'值。 –

安装熊猫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']) 
+0

如何自动创建'start = datetime',不同的股票有不同的值 –

+0

您将日期放入您要请求的日期时间,并将股票代码放入符号中... – mrCarnivore

+0

您无法构建手动网络爬虫。 –

据我了解您想要下载的所有可能的数据为特定的股票。所以要做到这一点,如果你提供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]}) 

如果你真的需要的最早日期,那么你可以使用上面的代码,并从中提取响应的第一天。

Reference

编辑

我确实知道,网页抓取是不是一个有效的选项,但是这是我们必须因为雅虎已经撤出所有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]) 
+0

你的代码有问题,请测试它。 –

+0

我做到了,你能告诉我什么错误信息,你会收到吗?,它运行良好与python 2.7和scrapy 1.3.3 – Wilfredo

+0

你能上传你的项目的设置?也许有一个错过配置。 – Wilfredo

  1. 两个间隔1和间隔2是‘纪元以来的秒数’值,你可以使用python时间戳和这些值之间进行转换datetime.datetime.fromtimestamp(dt)int(dt.timestamp())。但是正如其他人已经提到的那样,您不需要为这些参数指定确切的数字,对于所有股票,您可以对period1使用零,对period2使用2000000000。

  2. 重要的是,相同的“crumb”值适用于下载所有股票一段时间(大约1周)。因此,不要在每次下载请求之前获得新的“碎屑”,只有在得到“未经授权”响应时才应该缓存并更新;您的下载速度会提高两倍。拿到面包屑值最简单的方法是要求雅虎主页(https://finance.yahoo.com/),找到“用户”:{“面包屑”:?”串有