温文尔雅的紫菜汤 · 不知道你顶不顶得住?徐睿知,身材竟然这么绝! ...· 3 月前 · |
爱旅游的盒饭 · 江苏省人民政府 政府办公室(厅)文件 ...· 4 月前 · |
单身的拐杖 · 2021-2022学年第二学期硕博研究生选课 ...· 6 月前 · |
读研的山楂 · 2024年江苏高考改革方案-最新高考政策解读 ...· 10 月前 · |
强悍的台灯 · 【全国3年以下10-15万二手睿蓝汽车】全国 ...· 1 年前 · |
当使用Python2.7与
urllib2
一起从API检索数据时,我会得到错误
[Errno 104] Connection reset by peer
。是什么导致了错误,应该如何处理错误,这样脚本才不会崩溃?
ticker.py
def urlopen(url):
response = None
request = urllib2.Request(url=url)
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
溯源
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
发布于 2013-12-13 14:27:16
“由对等方重置连接”是TCP/IP等效于将电话重新挂在钩子上。这比不回答更礼貌,只留下一个人悬着。但这并不是真正礼貌的TCP/IP转换器所期望的FIN。( From other SO answer )
所以你不能做任何事情,这是服务器的问题。
但是您可以使用
try .. except
块来处理该异常:
from socket import error as SocketError
import errno
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.
发布于 2017-06-19 15:02:40
您可以尝试向代码中添加一些
time.sleep
调用。
服务器端似乎将每个时间单位(小时、日、秒)的请求量限制为安全问题。您需要猜测多少(可能使用另一个脚本与一个计数器?)并调整您的脚本,使其不超过此限制。
为了避免代码崩溃,请使用
try .. except
在urllib2调用中捕获此错误。
发布于 2020-05-05 08:56:03
有一种方法可以直接在ConnectionResetError的except子句中捕获错误,更好地隔离正确的错误。此示例还捕获超时。
from urllib.request import urlopen
from socket import timeout
url = "http://......"
string = urlopen(url, timeout=5).read()
读研的山楂 · 2024年江苏高考改革方案-最新高考政策解读-大学生必备网 10 月前 |