2011-12-18 5 views
2

次のコードを書いて、S & P 500の株に関するデータを取得しました。コードは機能しますが、urlopenリクエストの数が非常に遅いです。これをスピードアップするためにどのような戦略を使用できますか?urllib.requestを使用して在庫データを取得

from urllib.request import urlopen 
import csv 


class StockQuote: 
    """gets stock data from Yahoo Finance""" 

    def __init__(self, quote): 
     self.quote = quote 

    def lastPrice(self): 
     url = 'http://finance.yahoo.com/d/quotes.csv?s={ticker}&f=l1'.format(ticker=self.quote) 
     return bytes.decode((urlopen(url).read().strip())) 

    def volume(self): 
     url = 'http://finance.yahoo.com/d/quotes.csv?s={ticker}&f=v0'.format(ticker=self.quote) 
     return bytes.decode((urlopen(url).read().strip())) 

    def yearrange(self): 
     url = 'http://finance.yahoo.com/d/quotes.csv?s={ticker}&f=w0'.format(ticker=self.quote) 
     return bytes.decode((urlopen(url).read().strip())) 

    def PEratio(self): 
     url = 'http://finance.yahoo.com/d/quotes.csv?s={ticker}&f=r0'.format(ticker=self.quote) 
     return bytes.decode((urlopen(url).read().strip())) 

    def bookValue(self): 
     url = 'http://finance.yahoo.com/d/quotes.csv?s={ticker}&f=b4'.format(ticker=self.quote) 
     return bytes.decode((urlopen(url).read().strip())) 

    def EBITDA(self): 
     url = 'http://finance.yahoo.com/d/quotes.csv?s={ticker}&f=j4'.format(ticker=self.quote) 
     return bytes.decode((urlopen(url).read().strip())) 

    def PEGRatio(self): 
     url = 'http://finance.yahoo.com/d/quotes.csv?s={ticker}&f=r5'.format(ticker=self.quote) 
     return bytes.decode((urlopen(url).read().strip())) 

    def ticker(self): 
     url = 'http://finance.yahoo.com/d/quotes.csv?s={ticker}&f=s0'.format(ticker=self.quote) 
     return bytes.decode((urlopen(url).read().strip())) 


def openSP500file(): 
    SP500 = csv.reader(open(r'C:\Users\dev\Desktop\SP500.csv', 'r'), delimiter=',') 
    for x in SP500: 
     indStk = x[0] 
     printdata(indStk) 

def printdata(stk): 
    stkObj = StockQuote(stk) 
    stkdata= {} 
    stkdata['Ticker'] = stkObj.ticker() 
    stkdata['Price'] = stkObj.lastPrice() 
    stkdata['PE Ratio'] = stkObj.PEratio() 
    stkdata['Volume'] = stkObj.volume() 
    stkdata['Year Range'] = stkObj.yearrange() 
    stkdata['Book Value per Share'] = stkObj.bookValue() 
    stkdata['EBITDA'] = stkObj.EBITDA() 
    stkdata['PEG Ratio'] = stkObj.PEGRatio() 
    print(stkdata) 

def main(): 
    openSP500file() 


if __name__ == '__main__': 
    main() 

ありがとうございます!

答えて

2

threadingまたはmultiprocessingモジュールを使用すると、これらのURLをすべて同時に取得することができます。そのため、フェッチは他のものとは関係がないため、時間を大幅に節約できます。

+0

ありがとう!私はどちらのモジュールも使用していませんが、私はそれを動作させることができるかどうかを確認するためにそれを刺すでしょう。 –

3

リクエストがすべて同じドメインに送信されている場合は、urllib3を使用することをおすすめします。これは標準的なPythonのインストールではありませんが、接続プーリングを実装しているため、すべての個別の要求がより高速です。

+0

ありがとう! Pythonでスレッディングモジュールを見つけた後、私はそのライブラリをチェックアウトします。 –

3

あなたはrequest.urlopenに一度のコールで複数の銘柄のための情報を要求することができます。

import urllib.request as request 
import urllib.parse as parse 
import csv 
import codecs 
import pprint 

def printdata(stks): 
    params = parse.urlencode((('s', '+'.join(stks)), ('f', 'sl1rvwb4j4r5'))) 
    url = 'http://finance.yahoo.com/d/quotes.csv' 
    url = '?'.join((url, params)) 
    req = request.urlopen(url) 
    f = codecs.getreader('utf8')(req) 
    fields = '''Ticker Price PE_Ratio Volume Year_Range Book_Value_per_Share 
       EBITDA PEG_Ratio'''.split() 
    for row in csv.reader(f): 
     stkdata = dict(zip(fields, row))   
     pprint.pprint(stkdata) 

printdata('YHOO GOOG MSFT'.split()) 

利回り

{'Book_Value_per_Share': '10.051', 
'EBITDA': '1.406B', 
'PEG_Ratio': '1.47', 
'PE_Ratio': '18.56', 
'Price': '14.96', 
'Ticker': 'YHOO', 
'Volume': '32625192', 
'Year_Range': '11.09 - 18.84'} 
{'Book_Value_per_Share': '169.355', 
'EBITDA': '13.446B', 
'PEG_Ratio': '0.89', 
'PE_Ratio': '21.12', 
'Price': '625.96', 
'Ticker': 'GOOG', 
'Volume': '4459782', 
'Year_Range': '473.02 - 642.96'} 
{'Book_Value_per_Share': '7.062', 
'EBITDA': '30.146B', 
'PEG_Ratio': '0.98', 
'PE_Ratio': '9.29', 
'Price': '26.00', 
'Ticker': 'MSFT', 
'Volume': '101410080', 
'Year_Range': '23.65 - 29.46'} 
関連する問題