我正在使用 Twitter-py 编写 python 来抓取 Twitter 空间。我已将爬网程序设置为在每次请求 api.twitter.com 之间休眠一段时间(2 秒)。然而,运行一段时间后(大约1次),当Twitter的速率限制尚未超过时,我得到了这个错误。
[Errno 10054] An existing connection was forcibly closed by the remote host.
此问题的可能原因是什么以及如何解决?
我查了一下,发现Twitter服务器本身可能会因为请求较多而强制关闭连接。
提前非常感谢您。
这可能是由于连接两端对于保活期间连接是否超时不一致造成的。 (您的代码尝试在服务器关闭连接时重用该连接,因为它已经空闲太久了。)您基本上应该通过新连接重试该操作。 (我很惊讶你的图书馆不会自动执行此操作。)
我知道这是一个非常老的问题,但可能您需要设置请求标头。这为我解决了。
例如“用户代理”、“接受”等。这是一个用户代理的示例:
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)
原因有很多,比如
要详细检查问题,可以使用 Wireshark。
或者您可以重新请求或重新连接。
对我来说,这个问题是在尝试连接 SAP Hana 数据库时出现的。当我收到此错误时,
操作错误:与 HANA 服务器的连接丢失(ConnectionResetError(10054,'现有连接被远程主机强制关闭',无,10054,无))
我尝试运行连接代码(如下所述),这又产生了该错误,并且它成功了。
导入pyhdb 连接= pyhdb.connect(主机=“example.com”,端口= 30015,用户=“用户”,密码=“秘密”) 光标 = 连接.cursor() 光标.execute("从虚拟中选择'Hello Python World'") 游标.fetchone() 连接.close()
这是因为服务器拒绝连接。它可能需要您等待一段时间然后重试。尝试通过注销然后重新登录来关闭 Hana Studio。继续运行代码多次。
我用 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
不客气:)”
我遇到了同样的错误,并在我的请求中添加代理解决了这个问题。 例如,
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
)