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

问题描述 投票:0回答:7

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

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

此问题的可能原因是什么以及如何解决?

我查了一下,发现Twitter服务器本身可能会因为请求较多而强制关闭连接。

提前非常感谢您。

python twitter web-crawler
7个回答
27
投票

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


15
投票

我知道这是一个非常老的问题,但可能您需要设置请求标头。这为我解决了。

例如“用户代理”、“接受”等。这是一个用户代理的示例:

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)

14
投票

原因有很多,比如

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

要详细检查问题,可以使用 Wireshark。

或者您可以重新请求或重新连接。


4
投票

ping_interval = 2 中设置 websocket.run_forever() 后,我得到了同样的错误

([WinError 10054] 现有连接被远程主机强制关闭)
websocket-client
。 (我有多个线程连接到同一主机。)

设置

ping_interval = 10
ping_timeout = 9
解决了该问题。可能您需要减少请求量并停止让主机忙碌,否则它将强制断开您的连接。


2
投票

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

操作错误:与 HANA 服务器的连接丢失(ConnectionResetError(10054,'现有连接被远程主机强制关闭',无,10054,无))

我尝试运行连接代码(如下所述),这又产生了该错误,并且它成功了。


    导入pyhdb
    连接= pyhdb.connect(主机=“example.com”,端口= 30015,用户=“用户”,密码=“秘密”)
    光标 = 连接.cursor()
    光标.execute("从虚拟中选择'Hello Python World'")
    游标.fetchone()
    连接.close()

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


2
投票

我用 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在这里的回答——“就这样做,

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

不客气:)”


0
投票

我遇到了同样的错误,并在我的请求中添加代理解决了这个问题。 例如,

proxies = {
  "http": "http://proxy.company.com:8080",
  "https": "http://proxy.company.com:8080"
}
headers = {
  "Accept": "application/json"
}

response = requests.get(
  url=url, 
  auth=HTTPBasicAuth(username=username, password=password),
  headers=headers,
  proxies=proxies,
  timeout=10
)
© www.soinside.com 2019 - 2024. All rights reserved.