如何从雅虎财务获得最大历史价格数据?

时间:2017-10-20 11:39:14

标签: python scrapy yahoo-finance

我希望通过雅虎财务的scrapy获得最大的历史价格数据 这是fb(facebook)最大历史价格数据的网址。

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

为了编写股票价格网络爬虫,我无法解决两个问题 1.如何获得论证期限1? 您可以在网页上手动获取,只需单击最大值 如何用python代码获取参数?
不同的股票具有不同的期间1值。

enter image description here

2.如何自动创建参数crumb = 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

如何在我的网络抓取器框架中填写上面的空白?

5 个答案:

答案 0 :(得分:6)

据我所知,您想要下载特定代码的所有可能数据。所以要做到这一点,如果你提供0代替period1,那么你实际上不需要提供period1参数,那么Yahoo 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。您可能会找到一些第三方解决方案,但所有这些解决方案都在其源代码中使用抓取功能,并且他们会在数据中添加一些额外的转换,从而降低整体效率。

答案 1 :(得分:2)

安装pandas 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'])

答案 2 :(得分:0)

如果您想要的是整个历史记录,您实际上并不需要计算最大日期,请使用合理的旧日期(在下面的示例中为1900/01/01)。例如,假设您对thing_to_build: $(shell find_node_module my-dependent-module)/dist/foobar.lib 的股票感兴趣,那么这应该有效

FB

答案 3 :(得分:0)

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

  2. 重要的是,相同的“crumb”值对于下载所有股票一段时间(约1周)是有效的。因此,在每次下载请求之前不要获得新的“碎屑”,您应该缓存它并仅在您获得“未授权”响应时更新;您的下载速度将快两倍。获取碎屑值的最简单方法是请求Yahoo主页(https://finance.yahoo.com/)并找到“user”:{“crumb”:“substring there。

答案 4 :(得分:0)

如果仅将0替换为时段1,则它应该可以正常工作,因为间隔将是您单击的时间的开始。

您可以将第二个期间作为一个非常大的整数(例如1900000000)放置,它将只吸收该日期之前发生的所有情况。