2017-10-20 118 views
3

我想從雅虎財經獲得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'值。 –

回答

2

安裝熊貓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

您無法構建手動網絡爬蟲。 –

4

據我瞭解您想要下載的所有可能的數據爲特定的股票。所以要做到這一點,如果你提供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,並且爲數據添加了一些額外的轉換,從而降低了整體效率。

0

如果你想要的是整個歷史,你真的不需要計算最大日期,使用合理的舊日期(在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

0
  1. 兩個間隔1和間隔2是‘紀元以來的秒數’值,你可以使用python時間戳和這些值之間進行轉換datetime.datetime.fromtimestamp(dt)int(dt.timestamp())。但是正如其他人已經提到的那樣,您不需要爲這些參數指定確切的數字,對於所有股票,您可以對period1使用零,對period2使用2000000000。

  2. 重要的是,相同的「crumb」值適用於下載所有股票一段時間(大約1周)。因此,不要在每次下載請求之前獲得新的「碎屑」,只有在得到「未經授權」響應時才應該緩存並更新;您的下載速度會提高兩倍。拿到麪包屑值最簡單的方法是要求雅虎主頁(https://finance.yahoo.com/),找到「用戶」:{「麪包屑」:?」串有