2017-02-19 2 views
1

Ich benutze Python v3.6. Für ein Youtube-Tutorial folge ich. Aus irgendeinem Grund, wenn ich diesen Code ausführen, sehe ich CSV-Datei gespeichert wurde (genau 47 Dateien), aber nicht alle von ihnen. Kann mir bitte jemand zeigen, was ich falsch mache.Fehler Web Scraping Daten von Yahoo

import datetime as dt 
    import matplotlib.pyplot as plt 
    from matplotlib import style 
    from matplotlib.finance import candlestick_ohlc 
    import matplotlib.dates as mdates 
    import pandas as pd 
    import pandas_datareader.data as web 
    import bs4 as bs 
    import pickle 
    import requests 
    import os 
    import csv 
    import numpy as np 


    def tsx_tickers(): 
     resp = requests.get('http://web.tmxmoney.com/indices.php?section=tsx&index=%5ETSX') 
     soup = bs.BeautifulSoup(resp.text, "lxml") 
     table = soup.find('table', {'class': 'indices-table'}) 
     tickers = [] 
     for row in table.findAll('tr')[1:]: 
      ticker = row.findAll('td')[1].text 
      tickers.append(ticker.replace(".","-") + ".TO") 

     with open("tsxticker.pickle", "wb") as f: 
      pickle.dump(tickers, f) 

     print(tickers) 
     return tickers 

def get_data_from_yahoo(reload_tsx = False): 
    if reload_tsx: 
     tickers = tsx_tickers() 
    else: 
     with open("tsxticker.pickle", "rb") as f: 
      tickers = pickle.load(f) 

    if not os.path.exists('stock_dfs'): 
     os.makedirs('stock_dfs') 

    start = dt.datetime(2000, 1, 1) 
    end = dt.datetime(2016, 12, 13) 

    for ticker in tickers: 
     if not os.path.exists('stock_dfs/{}.csv'.format(ticker)): 
      time.sleep(2) 
      df = web.DataReader(ticker, 'yahoo', start, end) 
      df.to_csv('stock_dfs/{}.csv'.format(ticker)) 
     else: 
      print('Already have {}'.format(ticker)) 

Ich erhalte diesen Fehler

Traceback (most recent call last): 
    File "C:\Users\X\Desktop\xfile\sentdex.py", line 77, in <module> 
    get_data_from_yahoo() 
    File "C:\Users\X\Desktop\xfile\sentdex.py", line 72, in get_data_from_yahoo 
    df = web.DataReader(ticker, 'yahoo', start, end) 
    File "C:\Users\X\AppData\Local\Programs\Python\Python36-32\lib\site-packages\pandas_datareader\data.py", line 116, in DataReader 
    session=session).read() 
    File "C:\Users\X\AppData\Local\Programs\Python\Python36-32\lib\site-packages\pandas_datareader\yahoo\daily.py", line 76, in read 
    df = super(YahooDailyReader, self).read() 
    File "C:\Users\X\AppData\Local\Programs\Python\Python36-32\lib\site-packages\pandas_datareader\base.py", line 155, in read 
    df = self._read_one_data(self.url, params=self._get_params(self.symbols)) 
    File "C:\Users\X\AppData\Local\Programs\Python\Python36-32\lib\site-packages\pandas_datareader\base.py", line 74, in _read_one_data 
    out = self._read_url_as_StringIO(url, params=params) 
    File "C:\Users\X\AppData\Local\Programs\Python\Python36-32\lib\site-packages\pandas_datareader\base.py", line 85, in _read_url_as_StringIO 
    response = self._get_response(url, params=params) 
    File "C:\Users\X\AppData\Local\Programs\Python\Python36-32\lib\site-packages\pandas_datareader\base.py", line 120, in _get_response 
    raise RemoteDataError('Unable to read URL: {0}'.format(url)) 
pandas_datareader._utils.RemoteDataError: Unable to read URL: http://ichart.finance.yahoo.com/table.csv?s=OTEX.TO&a=0&b=1&c=2015&d=11&e=13&f=2016&g=d&ignore=.csv 

Antwort

0

Es scheint ein Yahoo Problem gewesen zu sein, weil es wieder anfing zu arbeiten ...

0

Beim Kratzen Sie, dass viele bewusst sein müssen Anbieter (vor allem große Namen wie Google, Yahoo) haben Gegenmaßnahmen, die versuchen, automatisierte Anfragen zu vereiteln. Frequenzbegrenzung ist ein guter Schritt, um einen Treffer zu vermeiden, aber 2 Sekunden könnten sogar zu schnell sein.

In jedem Fall ist es wahrscheinlich besser, die Daten mit Requests oder ähnlichem kontrollierter herunterzuladen, was eine gültige HTTP-Antwort nicht erstickt und den Inhalt für Sie speichert.

response = requests.get('http://yahoo.com/finance...') 
# server 429's because it doesn't like you, or might 200 and just have malformed content 
try: 
    parse(response.content) 
except: 
    with open('dump.log', 'wb') as f: 
     f.write(response.content) 
    raise 

Dann können Sie sich den Inhalt der Halde schauen und sehen, warum es nicht, und/oder die Sicherung laden und weitergeben Inhalt parse() ist es nun zu prüfen, funktioniert.

Sie können es auch umstellen und es erneut versuchen, wenn Sie eine fehlerhafte Analyse erhalten.

MAX_ATTEMPTS = 3 
# ... 
for ticker in tickers: 
    if not os.path.exists('stock_dfs/{}.csv'.format(ticker)): 
     for attempt in range(MAX_ATTEMPTS): 
      time.sleep(2) 
      try: 
       df = web.DataReader(ticker, 'yahoo', start, end) 
      except Exception as e: 
       if attempt < MAX_ATTEMPTS - 1: 
        print('Attempt {}: {}'.format(attempt + 1, str(e))) 
       else: 
        raise 
      else: 
       break