我正在使用某个网站提供的应用程序定期从该网站收集一些数据,比如一次 30 秒。 返回的响应然后记录在数据库中。
我通过导入请求并编写代码来捕获异常来使用请求模块。 主要功能代码如下:
def get_response(self):
try:
response = requests.get(self.request_url)
if response.status_code == 200:
return response.json()
except Exception as e:
msg = "Exception is:\n %s \n" % e
print msg
上述功能在前几个小时内运行良好。
该函数还可以从一些异常中恢复,例如:
('连接中止。', BadStatusLine("''",))
或者
('连接中止。',错误(10053,''))
它忽略异常(通过在数据库中记录 Null)并继续获取下一周期的响应。
但是,当遇到 10054 错误时,该功能将停止工作。
Exception is:
('Connection aborted.', error(10054, ''))
检查数据库发现10054错误出现后所有响应都是Null。 我首先猜测网站可能会崩溃,因此没有收到任何回复。 但是当我手动重新启动该功能时,它又开始得到响应。 所以这与网站崩溃无关。
我在 stackoverflow 中搜索并发现: Errno 10054 现有连接被远程主机强制关闭。 但不知道如何解决。
您能为这个问题提供一些解决方案吗?(理想情况下) 或者提供一些解决方案来重新启动该功能而无需手动重新启动? (看起来一旦我重新启动该功能,它又可以工作了。)
提前致谢。
网络服务器主动拒绝您的连接。这通常是因为它很拥塞、有速率限制或认为您正在发起拒绝服务攻击。如果您从服务器获得此信息,则应该在重试之前先休息一下。事实上,如果你在重试之前不睡眠,那么你就是拒绝服务攻击。礼貌的做法是实施渐进式睡眠,例如 (1,2,4,8,16,32) 秒。
你可以尝试一下。它解决了我的 ConnectionResetError 10054 问题。
session = requests.Session()
session.headers = {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/71.1.2222.33 Safari/537.36",
"Accept-Encoding": "*",
"Connection": "keep-alive"
}
response = session.get(self.request_url)
您看到的错误消息表明与远程主机的连接被该主机突然终止。这可能是由于多种原因造成的:
网络问题:您的机器和远程主机之间可能存在网络连接问题,导致连接被强制关闭。 防火墙或安全软件:有时,您的计算机或远程主机上的防火墙设置或安全软件可能会干扰连接并意外关闭它。 服务器过载:如果远程主机遇到大量流量或过载,它可能会关闭连接以释放资源。 故意关闭:远程主机可能由于某些策略或配置原因而故意关闭连接。