2017-10-20 22 views
3

yahoo financeからscrapyで最大の過去の価格データを取得したい。
ここにfb(facebook)の最大履歴価格データのURLがあります。yahooファイナンスから最大の履歴価格データを取得するにはどうすればよいですか?

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

株価ウェブクローラーを書くには、私は解決できない2つの問題があります。
1.引数period1を取得する方法
ウェブページで手作業で入手できます。クリックするだけです。
Pythonコードで引数を取得する方法は?
異なる在庫のperiod1の値が異なります。

enter image description here

2.How異なるクラム値と、自動的に別の銘柄を引数クラム= 1qRuQKELxmMを作成するには?
ここに私の在庫最大履歴データがあります。

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 

私のWeb Scrawlerフレームワークで上記の空白を埋める方法は?

+0

をサブストリング – Dark

+0

Wihtパンダ、このようなコードクラム値を取得する最も簡単な方法は、Yahooのメインページ(https://finance.yahoo.com/)を要求し、見つける「ユーザー」ことです'start = datetime.datetime(2010、1、1)'が必要です。異なる在庫には異なる開始日時がありますが、問題は残ります。 –

+0

[This](http://blog.bradlucas.com/posts/2017-06-02それは 'crumb'値を取得する方法を示して-new-ヤフー・ファイナンス引用ダウンロード-URL /)リンクはあなたに助けになるかもしれません。 –

答えて

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

、自動的に異なると異なる株式を' =開始datetime'を作成する方法値?? –

+0

あなたは要求したい日時に日付を入れ、記号に株式コードを入れます。 – mrCarnivore

+0

Webクローラを手で –

4

私はあなたが特定のティッカーのために可能なすべてのデータをダウンロードしたい理解しています。これを行うには、period1の代わりに0を指定し、Yahoo APIがデフォルトとして最も古い日付を設定する場合、実際にはperiod1パラメータを指定する必要はありません。

質問に表示された方法で引用符をダウンロードするには、残念なことにCookieを処理する必要があります。私は自分自身が必要な場合にのみティッカー、自分が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

編集

私は、Webスクレイピングは、効率的な選択肢ではないことを知っていますが、Yahooはすでに、すべてのAPIを撤回したので、それは我々が持っている唯一のオプションです。いくつかのサードパーティーのソリューションがありますが、そのすべてがソースコード内でスクレイピングを使用し、データ全体に効率を低下させる追加の変換を追加します。

0

あなたが望むのは、実際に最大の日付を計算する必要はありませんが、妥当な古い日付(1900/01/01以下の例)を使用してください。たとえば、これは

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および1.3.3 scrapy – Wilfredo

+0

で正常に動作?,受けるん教えてくださいだろうか?おそらく、設定が間違っている可能性があります。 – Wilfredo

0
  1. どちらも周期1と周期2は値 『エポックからの秒数』であり、あなたは、Pythonのタイムスタンプと使用してこれらの値の間で変換することができます動作するはずです、あなたはFBの株式に興味を持っていると仮定しましょうdatetime.datetime.fromtimestamp(dt)およびint(dt.timestamp())。しかし既に述べたように、これらのパラメータに正確な数値を指定する必要はありません。すべての株式について、period1にはゼロを、period2には2000000000を使用できます。同じ「クラム」の値は、いくつかの時間(約1週間)のために、すべての銘柄をダウンロードするために有効であることを

  2. 重要。だから、ダウンロード要求が出る前に新しい "クラム"を取得するのではなく、キャッシュして "Unauthorized"レスポンスが得られたときに更新するだけです。ダウンロードが2倍高速に実行されます。 {「クラム」::。?」あなたはパンダを使用して考えがありますが

関連する問題