Bei Verwendung von Python 2.7 mit urllib2
zum Abrufen von Daten von einer API wird der Fehler angezeigt [Errno 104] Connection reset by peer
. Was verursacht den Fehler und wie soll der Fehler behandelt werden, damit das Skript nicht abstürzt?
ticker.py
def urlopen(url):
response = None
request = urllib2.Request(url=url)
try:
response = urllib2.urlopen(request).read()
except urllib2.HTTPError as err:
print "HTTPError: {} ({})".format(url, err.code)
except urllib2.URLError as err:
print "URLError: {} ({})".format(url, err.reason)
except httplib.BadStatusLine as err:
print "BadStatusLine: {}".format(url)
return response
def get_rate(from_currency="EUR", to_currency="USD"):
url = "https://finance.yahoo.com/d/quotes.csv?f=sl1&s=%s%s=X" % (
from_currency, to_currency)
data = urlopen(url)
if "%s%s" % (from_currency, to_currency) in data:
return float(data.strip().split(",")[1])
return None
counter = 0
while True:
counter = counter + 1
if counter==0 or counter%10:
rateEurUsd = float(get_rate('EUR', 'USD'))
# does more stuff here
Zurück verfolgen
Traceback (most recent call last):
File "/var/www/testApp/python/ticker.py", line 71, in <module>
rateEurUsd = float(get_rate('EUR', 'USD'))
File "/var/www/testApp/python/ticker.py", line 29, in get_exchange_rate
data = urlopen(url)
File "/var/www/testApp/python/ticker.py", line 16, in urlopen
response = urllib2.urlopen(request).read()
File "/usr/lib/python2.7/urllib2.py", line 126, in urlopen
return _opener.open(url, data, timeout)
File "/usr/lib/python2.7/urllib2.py", line 406, in open
response = meth(req, response)
File "/usr/lib/python2.7/urllib2.py", line 519, in http_response
'http', request, response, code, msg, hdrs)
File "/usr/lib/python2.7/urllib2.py", line 438, in error
result = self._call_chain(*args)
File "/usr/lib/python2.7/urllib2.py", line 378, in _call_chain
result = func(*args)
File "/usr/lib/python2.7/urllib2.py", line 625, in http_error_302
return self.parent.open(new, timeout=req.timeout)
File "/usr/lib/python2.7/urllib2.py", line 406, in open
response = meth(req, response)
File "/usr/lib/python2.7/urllib2.py", line 519, in http_response
'http', request, response, code, msg, hdrs)
File "/usr/lib/python2.7/urllib2.py", line 438, in error
result = self._call_chain(*args)
File "/usr/lib/python2.7/urllib2.py", line 378, in _call_chain
result = func(*args)
File "/usr/lib/python2.7/urllib2.py", line 625, in http_error_302
return self.parent.open(new, timeout=req.timeout)
File "/usr/lib/python2.7/urllib2.py", line 400, in open
response = self._open(req, data)
File "/usr/lib/python2.7/urllib2.py", line 418, in _open
'_open', req)
File "/usr/lib/python2.7/urllib2.py", line 378, in _call_chain
result = func(*args)
File "/usr/lib/python2.7/urllib2.py", line 1207, in http_open
return self.do_open(httplib.HTTPConnection, req)
File "/usr/lib/python2.7/urllib2.py", line 1180, in do_open
r = h.getresponse(buffering=True)
File "/usr/lib/python2.7/httplib.py", line 1030, in getresponse
response.begin()
File "/usr/lib/python2.7/httplib.py", line 407, in begin
version, status, reason = self._read_status()
File "/usr/lib/python2.7/httplib.py", line 365, in _read_status
line = self.fp.readline()
File "/usr/lib/python2.7/socket.py", line 447, in readline
data = self._sock.recv(self._rbufsize)
socket.error: [Errno 104] Connection reset by peer
error: Forever detected script exited with code: 1
python
ubuntu
python-2.7
urllib2
Athena Weisheit
quelle
quelle
Antworten:
Sie können also nichts dagegen tun, es ist das Problem des Servers.
Sie können jedoch
try .. except
block verwenden, um diese Ausnahme zu behandeln:from socket import error as SocketError import errno try: response = urllib2.urlopen(request).read() except SocketError as e: if e.errno != errno.ECONNRESET: raise # Not error we are looking for pass # Handle error here.
quelle
Sie können versuchen
time.sleep
, Ihrem Code einige Aufrufe hinzuzufügen .Es scheint, dass die Serverseite die Anzahl der Anforderungen pro Zeiteinheit (Stunde, Tag, Sekunde) als Sicherheitsproblem begrenzt. Sie müssen erraten, wie viele (möglicherweise ein anderes Skript mit einem Zähler verwenden?) Und Ihr Skript anpassen, um diese Grenze nicht zu überschreiten.
Versuchen Sie, diesen Fehler mit
try .. except
den urllib2-Aufrufen abzufangen , um zu verhindern, dass Ihr Code abstürzt .quelle
Es gibt eine Möglichkeit, den Fehler direkt in der Except-Klausel mit ConnectionResetError abzufangen, um den richtigen Fehler besser zu isolieren. In diesem Beispiel wird auch das Timeout erfasst.
from urllib.request import urlopen from socket import timeout url = "http://......" try: string = urlopen(url, timeout=5).read() except ConnectionResetError: print("==> ConnectionResetError") pass except timeout: print("==> Timeout") pass
quelle