关于Python请求:Python请求 – 无法加载任何URL:’无端响应的远程端关闭连接’

Python requests - cant load any url: 'Remote end closed connection without response'

我试图用anaconda python 3.5从url中获取数据

1
2
3
4
import requests
url ='http://eutils.ncbi.nlm.nih.gov/entrez/eutils/einfo.fcgi'
r = requests.get(url)
r.content

可以在浏览器中打开网址而不会出现问题...

但我收到一个错误(对于这个网址和我尝试的任何其他网址):

-------------------------------------------------------------------------- TypeError Traceback (most recent call
last)
C:\Anaconda3\lib\site-packages
equests\packages\urllib3\connectionpool.py
in _make_request(self, conn, method, url, timeout,
**httplib_request_kw)
375 try: # Python 2.7, use buffering of HTTP responses
--> 376 httplib_response = conn.getresponse(buffering=True)
377 except TypeError: # Python 2.6 and older

TypeError: getresponse() got an unexpected keyword argument
'buffering'

During handling of the above exception, another exception occurred:

RemoteDisconnected Traceback (most recent call
last)
C:\Anaconda3\lib\site-packages
equests\packages\urllib3\connectionpool.py
in urlopen(self, method, url, body, headers, retries, redirect,
assert_same_host, timeout, pool_timeout, release_conn, **response_kw)
558 timeout=timeout_obj,
--> 559 body=body, headers=headers)
560

C:\Anaconda3\lib\site-packages
equests\packages\urllib3\connectionpool.py
in _make_request(self, conn, method, url, timeout,
**httplib_request_kw)
377 except TypeError: # Python 2.6 and older
--> 378 httplib_response = conn.getresponse()
379 except (SocketTimeout, BaseSSLError, SocketError) as e:

C:\Anaconda3\lib\http\client.py in getresponse(self) 1173
try:
-> 1174 response.begin() 1175 except ConnectionError:

C:\Anaconda3\lib\http\client.py in begin(self)
281 while True:
--> 282 version, status, reason = self._read_status()
283 if status != CONTINUE:

C:\Anaconda3\lib\http\client.py in _read_status(self)
250 # sending a valid response.
--> 251 raise RemoteDisconnected("Remote end closed connection without"
252 " response")

RemoteDisconnected: Remote end closed connection without response

During handling of the above exception, another exception occurred:

ProtocolError Traceback (most recent call
last) C:\Anaconda3\lib\site-packages
equests\adapters.py in
send(self, request, stream, timeout, verify, cert, proxies)
369 retries=self.max_retries,
--> 370 timeout=timeout
371 )

C:\Anaconda3\lib\site-packages
equests\packages\urllib3\connectionpool.py
in urlopen(self, method, url, body, headers, retries, redirect,
assert_same_host, timeout, pool_timeout, release_conn, **response_kw)
608 retries = retries.increment(method, url, error=e, _pool=self,
--> 609 _stacktrace=sys.exc_info()[2])
610 retries.sleep()

C:\Anaconda3\lib\site-packages
equests\packages\urllib3\util
etry.py
in increment(self, method, url, response, error, _pool, _stacktrace)
244 if read is False:
--> 245 raise six.reraise(type(error), error, _stacktrace)
246 elif read is not None:

C:\Anaconda3\lib\site-packages
equests\packages\urllib3\packages\six.py
in reraise(tp, value, tb)
308 if value.traceback is not tb:
--> 309 raise value.with_traceback(tb)
310 raise value

C:\Anaconda3\lib\site-packages
equests\packages\urllib3\connectionpool.py
in urlopen(self, method, url, body, headers, retries, redirect,
assert_same_host, timeout, pool_timeout, release_conn, **response_kw)
558 timeout=timeout_obj,
--> 559 body=body, headers=headers)
560

C:\Anaconda3\lib\site-packages
equests\packages\urllib3\connectionpool.py
in _make_request(self, conn, method, url, timeout,
**httplib_request_kw)
377 except TypeError: # Python 2.6 and older
--> 378 httplib_response = conn.getresponse()
379 except (SocketTimeout, BaseSSLError, SocketError) as e:

C:\Anaconda3\lib\http\client.py in getresponse(self) 1173
try:
-> 1174 response.begin() 1175 except ConnectionError:

C:\Anaconda3\lib\http\client.py in begin(self)
281 while True:
--> 282 version, status, reason = self._read_status()
283 if status != CONTINUE:

C:\Anaconda3\lib\http\client.py in _read_status(self)
250 # sending a valid response.
--> 251 raise RemoteDisconnected("Remote end closed connection without"
252 " response")

ProtocolError: ('Connection aborted.', RemoteDisconnected('Remote end
closed connection without response',))

During handling of the above exception, another exception occurred:

ConnectionError Traceback (most recent call
last) in ()
3 import requests
4 url ='http://eutils.ncbi.nlm.nih.gov/entrez/eutils/einfo.fcgi'
----> 5 r = requests.get(url)
6 r.content

C:\Anaconda3\lib\site-packages
equests\api.py in get(url, params,
**kwargs)
67
68 kwargs.setdefault('allow_redirects', True)
---> 69 return request('get', url, params=params, **kwargs)
70
71

C:\Anaconda3\lib\site-packages
equests\api.py in request(method, url,
**kwargs)
48
49 session = sessions.Session()
---> 50 response = session.request(method=method, url=url, **kwargs)
51 # By explicitly closing the session, we avoid leaving sockets open which
52 # can trigger a ResourceWarning in some cases, and look like a memory leak

C:\Anaconda3\lib\site-packages
equests\sessions.py in request(self,
method, url, params, data, headers, cookies, files, auth, timeout,
allow_redirects, proxies, hooks, stream, verify, cert, json)
466 }
467 send_kwargs.update(settings)
--> 468 resp = self.send(prep, **send_kwargs)
469
470 return resp

C:\Anaconda3\lib\site-packages
equests\sessions.py in send(self,
request, **kwargs)
574
575 # Send the request
--> 576 r = adapter.send(request, **kwargs)
577
578 # Total elapsed time of the request (approximately)

C:\Anaconda3\lib\site-packages
equests\adapters.py in send(self,
request, stream, timeout, verify, cert, proxies)
410
411 except (ProtocolError, socket.error) as err:
--> 412 raise ConnectionError(err, request=request)
413
414 except MaxRetryError as e:

ConnectionError: ('Connection aborted.', RemoteDisconnected('Remote
end closed connection without response',))


尝试使用请求会话。

1
2
3
4
5
6
7
8
9
10
11
import requests
MAX_RETRIES = 20
url ='http://eutils.ncbi.nlm.nih.gov/entrez/eutils/einfo.fcgi'

session = requests.Session()
adapter = requests.adapters.HTTPAdapter(max_retries=MAX_RETRIES)
session.mount('https://', adapter)
session.mount('http://', adapter)

r = session.get(url)
print(r.content)


对我来说,问题是HTTP模拟库。 我在我的测试中使用HTTPretty来模拟requests

HTTPretty库非常年轻,虽然它明确指出如果在测试期间请求任何未模拟的URL,它将引发UnmockedError,但它没有在requests库中引发它。 因此,如果您正在使用任何HTTP模拟库,尤其是直接模拟套接字的库,您可能会收到此错误。

HTTPretty中的错误消失了范围:

1
2
3
4
5
6
7
httpretty.enable()

# error might occur here

httpretty.disable()

# out of scope

This answer is written for Googlers and might not intersect with the interests of the OP.