Collectives™ on Stack Overflow
Find centralized, trusted content and collaborate around the technologies you use most.
Learn more about Collectives
Teams
Q&A for work
Connect and share knowledge within a single location that is structured and easy to search.
Learn more about Teams
I am writing python to crawl Twitter space using Twitter-py. I have set the crawler to sleep for a while (2 seconds) between each request to api.twitter.com. However, after some times of running (around 1), when the Twitter's rate limit not exceeded yet, I got this error.
[Errno 10054] An existing connection was forcibly closed by the remote host.
What are possible causes of this problem and how to solve this?
I have searched through and found that the Twitter server itself may force to close the connection due to many requests.
Thank you very much in advance.
This can be caused by the two sides of the connection disagreeing over whether the connection timed out or not during a keepalive. (Your code tries to reused the connection just as the server is closing it because it has been idle for too long.) You should basically just retry the operation over a new connection. (I'm surprised your library doesn't do this automatically.)
–
–
–
I know this is a very old question but it may be that you need to set the request headers. This solved it for me.
For example 'user-agent', 'accept' etc. here is an example with user-agent:
url = 'your-url-here'
headers = {'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.75 Safari/537.36'}
r = requests.get(url, headers=headers)
–
The network link between server and client may be temporarily going down.
running out of system resources.
sending malformed data.
To examine the problem in detail, you can use Wireshark.
or you can just re-request or re-connect again.
I got the same error ([WinError 10054] An existing connection was forcibly closed by the remote host) with websocket-client after setting ping_interval = 2
in websocket.run_forever()
. (I had multiple threads connecting to the same host.)
Setting ping_interval = 10
and ping_timeout = 9
solved the issue. May be you need to reduce the amount of requests and stop making host busy otherwise it will forcibly disconnect you.
For me this problem arised while trying to connect to the SAP Hana database. When I got this error,
OperationalError: Lost connection to HANA server (ConnectionResetError(10054, 'An existing connection was forcibly closed by the remote host', None, 10054, None))
I tried to run the code for connection(mentioned below), which created that error, again and it worked.
import pyhdb
connection = pyhdb.connect(host="example.com",port=30015,user="user",password="secret")
cursor = connection.cursor()
cursor.execute("SELECT 'Hello Python World' FROM DUMMY")
cursor.fetchone()
connection.close()
It was because the server refused to connect. It might require you to wait for a while and try again. Try closing the Hana Studio by logging off and then logging in again. Keep running the code for a number of times.
–
I fixed it with a while try loop, waiting for the response to set the variable in order to exit the loop.
When the connection has an exception, it waits five seconds, and continues looking for the response from the connection.
My code before fix, with the failed response HTTPSConnectionPool(host='etc.com', port=443): Max retries exceeded with url: / (Caused by ConnectTimeoutError(<urllib3.connection.HTTPSConnection object at 0x000001E9955A2050>, 'Connection to example.net timed out. (connect timeout=None)'))
from __future__ import print_function
import sys
import requests
def condition_questions(**kwargs):
proxies = {'https': 'example.com', 'http': 'example.com:3128'}
print(kwargs, file=sys.stdout)
headers = {'etc':'etc',}
body = f'''<etc>
</etc>'''
response_xml = requests.post('https://example.com', data=body, headers=headers, proxies=proxies)
except Exception as ex:
print("exception", ex, file=sys.stdout)
log.exception(ex)
finally:
print("response_xml", response_xml, file=sys.stdout)
return response_xml
After fix, with successful response response_xml <Response [200]>
:
import time
response_xml = ''
while response_xml == '':
response_xml = requests.post('https://example.com', data=body, headers=headers, proxies=proxies)
break
except Exception as ex:
print("exception", ex, file=sys.stdout)
log.exception(ex)
time.sleep(5)
continue
finally:
print("response_xml", response_xml, file=sys.stdout)
return response_xml
based on Jatin's answer here --"Just do this,
import time
page = ''
while page == '':
page = requests.get(url)
break
except:
print("Connection refused by the server..")
print("Let me sleep for 5 seconds")
print("ZZzzzz...")
time.sleep(5)
print("Was a nice sleep, now let me continue...")
continue
You're welcome :)"
Pip install failing due to OSError: ("Connection broken: ConnectionResetError(10054, 'An existing connection was forcibly closed 100054)
See more linked questions