python:[Errno 10054]远程主机强制关闭了现有连接

57hvy0tb  于 2022-12-02  发布在  Python
关注(0)|答案(6)|浏览(481)

我正在编写python来使用Twitter-py抓取Twitter空间。我已经将抓取器设置为在每次请求api.twitter.com之间休眠一段时间(2秒)。但是,在运行了一些时间(大约1秒)后,当Twitter的速率限制尚未超过时,我得到了这个错误。

[Errno 10054] An existing connection was forcibly closed by the remote host.

此问题的可能原因是什么以及如何解决此问题?
我已经搜索过了,发现Twitter服务器本身可能会由于许多请求而强制关闭连接。
非常感谢你提前。

uxh89sit

uxh89sit1#

这可能是由于连接的两端在keepalive期间对连接是否超时的意见不一致造成的。(您的代码试图在服务器关闭连接时重用该连接,因为它已经空闲了太长时间。)您基本上应该通过一个新的连接重试该操作。(我很惊讶您的库没有自动执行此操作。)

pepwfjgg

pepwfjgg2#

我知道这是一个很老的问题,但它可能是你需要设置请求头。
例如'user-agent'、'accept'等。以下是使用用户代理的示例:

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)
q9rjltbz

q9rjltbz3#

原因很多

  • 服务器和客户端之间的网络链接可能暂时断开。
  • 系统资源不足。
  • 发送格式错误的数据。

要详细检查该问题,可以使用Wireshark.
也可以重新请求或重新连接。

5vf7fwbs

5vf7fwbs4#

对我来说,这个问题是在尝试连接到SAPHana数据库时出现的。当我收到这个错误时,

OperationalError: Lost connection to HANA server (ConnectionResetError(10054, 'An existing connection was forcibly closed by the remote host', None, 10054, None))

我试着运行连接的代码(下面提到的),它再次创建了那个错误,它工作了。

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()

这是因为服务器拒绝连接。可能需要您等待一段时间,然后重试。请尝试通过注销并重新登录来关闭Hana Studio。继续运行代码多次。

x7rlezfr

x7rlezfr5#

websocket.run_forever()中设置**ping_interval = 2后,出现websocket-client的相同错误*([WinError 10054]远程主机强制关闭了现有连接)I。(有多个线程连接到同一主机。)
设置ping_interval = 10ping_timeout = 9解决了这个问题。可能您需要减少请求数量并
停止使主机忙碌**否则它将强制断开您的连接。

tct7dpnv

tct7dpnv6#

我用while try循环修复了它,等待响应设置变量以退出循环。
当连接出现异常时,它会等待五秒钟,然后继续查找来自连接的响应。
我的代码在修复之前,响应失败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>'''

    try:
        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

修复后,成功响应response_xml <Response [200]>

import time
...

response_xml = ''
    while response_xml == '':
        try:
            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

基于Jatin's answer here--“只要这样做,

import time

page = ''
while page == '':
    try:
        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

不客气:)”

相关问题