2017-08-30 2 views
0

Ich versuche, den Datensatz von Wikipedia mit Python zugreifen, ist der Zweck des Codes auf eine Tabelle von Sp500 Unternehmen zuzugreifen und den Datensatz in eine extrahieren cSV-Datei (jeder Daten Unternehmen in einer cSV-Datei) einen Teil der Daten sind gut zugänglich, aber ich bin immer Socket Ausnahme, die ich wenig schwer finden bin verstehe.Ich meine komplette Code gebeSo lösen Socket-Fehler beim Zugriff auf Daten aus Wikipedia mit Python

import bs4 as bs 
import datetime as dt 
import os 
import pandas as pd 
import pandas_datareader.data as web 
import pickle 
import requests 


def save_sp500_tickers(): 
resp = requests.get('http://en.wikipedia.org/wiki/List_of_S%26P_500_companies') 
soup = bs.BeautifulSoup(resp.text, 'lxml') 
table = soup.find('table', {'class': 'wikitable sortable'}) 
tickers = [] 
for row in table.findAll('tr')[1:]: 
    ticker = row.findAll('td')[0].text 
    tickers.append(ticker) 

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

return tickers 

#save_sp500_tickers() 


def get_data_from_yahoo(reload_sp500=False): 

if reload_sp500: 
    tickers = save_sp500_tickers() 
else: 
    with open("sp500tickers.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, 31) 

for ticker in tickers: 
    # just in case your connection breaks, we'd like to save our progress! 
    if not os.path.exists('stock_dfs/{}.csv'.format(ticker)): 
     df = web.DataReader(ticker, "yahoo", start, end) 
     df.to_csv('stock_dfs/{}.csv'.format(ticker)) 
    else: 
     print('Already have {}'.format(ticker)) 

get_data_from_yahoo() 

bekam ich die Ausnahme wie folgt

 Traceback (most recent call last): 
     File "C:\Users\Jeet Chatterjee\Data Analysis With Python for finance\op6.py", line 49, in <module> 
get_data_from_yahoo() 
    File "C:\Users\Jeet Chatterjee\Data Analysis With Python for finance\op6.py", line 44, in get_data_from_yahoo 
df = web.DataReader(ticker, "yahoo", start, end) 
    File "C:\Program Files (x86)\Python36-32\lib\site-packages\pandas_datareader\data.py", line 121, in DataReader 
session=session).read() 
     File "C:\Program Files (x86)\Python36-32\lib\site-packages\pandas_datareader\yahoo\daily.py", line 115, in read 
df = super(YahooDailyReader, self).read() 
     File "C:\Program Files (x86)\Python36-32\lib\site-packages\pandas_datareader\base.py", line 181, in read 
params=self._get_params(self.symbols)) 
     File "C:\Program Files (x86)\Python36-32\lib\site-packages\pandas_datareader\base.py", line 79, in _read_one_data 
out = self._read_url_as_StringIO(url, params=params) 
     File "C:\Program Files (x86)\Python36-32\lib\site-packages\pandas_datareader\base.py", line 90, in _read_url_as_StringIO 
response = self._get_response(url, params=params) 
     File "C:\Program Files (x86)\Python36-32\lib\site-packages\pandas_datareader\base.py", line 139, in _get_response 
raise RemoteDataError('Unable to read URL: {0}'.format(url)) 
    pandas_datareader._utils.RemoteDataError: Unable to read URL: https://query1.finance.yahoo.com/v7/finance/download/AGN?period1=946665000&period2=1483208999&interval=1d&events=history&crumb=6JtBOAj%5Cu002F6EP 

Bitte helfen Sie mir bei der Lösung dieser, danke im Voraus

Antwort

1

Es ist nicht zu viel falsch mit dem, was Sie tun, ein Problem ist, dass Yahoo Zeitserien Daten nicht garantiert werden zu 100% der Zeit verfügbar ist, tendiert es erscheinen und verschwinden. Ich habe gerade auf die Yahoo Seite geschaut; während es scheint, dass kein Problem mit Allergan (AGN), die die, die für Sie fehlgeschlagen war, zu dem Zeitpunkt, als ich versuchte Brown Forman (BF.B) und Berkshire Hathaway B (BRK.B) waren nicht verfügbar.

Ein weiteres Problem ist, dass Sie nicht davon ausgehen können, dass jedes Symbol auf dem SP 500 Zeitreihen Daten in den Bereichen haben wird, die Sie hart-codiert haben; einige sind nur für 2017.

Das Folgende ist eine leicht modifizierte Version Ihres Codes, der die besten Bemühungen macht, alle Symbole abzurufen, Daten vom 1. Januar 2000 bis zum aktuellen Tag anzufordern und einfach aufzugeben, wenn Yahoo nicht tut. t haben die Daten verfügbar.

Zum Zeitpunkt des Schreibens war dies in der Lage, Zeitreihen für 503 der 505 Symbole aktuell auf dem S & P 500 zu holen. Hinweis Ich habe einen Proxy-Server verwendet, Sie können diesen Teil des Codes einfach löschen oder auskommentieren.

import bs4 as bs 
import datetime as dt 
import os 
import pandas as pd 
import pandas_datareader.data as web 
import pickle 
import requests 

# proxy servers for internet connection 
proxies = { 
    'http': 'http://my.proxy.server:8080', 
    'https': 'https://my.proxy.server:8080', 
} 

symbol_filename = "sp500tickers.pickle" 

def save_sp500_tickers():  
    resp = requests.get('http://en.wikipedia.org/wiki/List_of_S%26P_500_companies', proxies=proxies) 
    soup = bs.BeautifulSoup(resp.text, 'lxml') 
    table = soup.find('table', {'class': 'wikitable sortable'}) 
    tickers = [] 
    for row in table.findAll('tr')[1:]: 
     ticker = row.findAll('td')[0].text 
     tickers.append(ticker) 
    with open(symbol_filename,"wb") as f: 
     pickle.dump(tickers,f) 
    return tickers 


def get_data_from_yahoo(reload_sp500=False): 
    if reload_sp500 or not os.path.exists(symbol_filename): 
     tickers = save_sp500_tickers() 
    else: 
     with open(symbol_filename,"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(dt.date.today().year, dt.date.today().month, dt.date.today().day) 

    for ticker in tickers: 
     if not os.path.exists('stock_dfs/{}.csv'.format(ticker)): 
      try: 
       print ticker 
       df = web.DataReader(ticker, "yahoo", start, end) 
       df.to_csv('stock_dfs/{}.csv'.format(ticker)) 
      except: 
       print ("No timeseries available for " + ticker) 
     else: 
      pass # print('Already have {}'.format(ticker)) 


os.environ["HTTP_PROXY"]=proxies['http'] 
os.environ["HTTPS_PROXY"]=proxies['https'] 
get_data_from_yahoo() 

Ich hoffe, dies ist hilfreich.

+0

Vielen Dank, es hat funktioniert. Können Sie erklären, warum Sie den Proxy definiert haben? – Mandrek

+0

@Mandrek Ich habe den Proxy nur so definiert, dass ich ihn in einem Firmennetzwerk ausgeführt habe und alle HTTP-Anfragen über einen HTTP-Proxy-Server ablaufen müssen. Wenn ich den Proxy nicht definiere, kann ich keine Anrufe tätigen, das ist alles. –

Verwandte Themen