本文主要介绍python远程主机强制关闭现有连接套接字超时设置errno 10054。有需要的朋友可以参考一下。
python socket . error:[errno 10054]远程主机强制关闭现有连接。问题解决方案:
前几天用python看网页。因为一个网站大量使用urlopen操作,会被那个网站认定为攻击。有时不再允许下载。造成urlopen()后,request.read()一直卡在那里。最终会抛出errno 10054。
此错误是由对等方重置的连接。也就是传说中的远程主机重置了这个连接。原因可能是套接字超时太长;也可能是在request=URL lib . request . urlpen(URL)之后没有执行request.close()操作;也可能是几秒钟没有睡眠,导致网站认为这种行为是攻击。
具体解决方案如下:
01 .导入插座
02 .导入时间
03 .超时=20
04.socket . set default time out(time out)#在这里,设置整个套接字层的超时。如果socket在后续文件中再次使用,则没有必要再次设置。
sleep_download_time=10
06.time . sleep(sleep _ download _ time)#在这里,时间是自己定的。
07.request=url lib . request . urlpen(URL)#这里是读取内容的URL。
08.content=request.read()# Read,一般在这里报错。
09.request.close()#记得关闭
因为urlopen之后的read()操作实际上调用了socket层的一些函数。因此,通过设置socket的默认超时时间,可以自行断网。你不必在read()等待。
当然,你也可以多写几个试试,除了在外层,例如:
尝试:
时间.睡眠(自我.睡眠_下载_时间)
request=URL lib . request . urlopen(URL)
content=request.read()
request.close()
除了UnicodeDecodeError作为e:
打印('-unicode decodedeerror url:',URL)
除了urllib.error.URLError作为e:
打印('-url错误url:',URL)
除了socket.timeout作为e:
打印('-套接字超时:',url)
总的来说没有问题。我说这话之前测试了上千个网页的下载量。但是,如果下载成千上万次,我做个测试,ms还是会跳出这个异常。可能是time.sleep()的时间太短,或者网络突然中断。我用urllib.request.retrieve()测试了一下,发现如果一直下载数据,总会有失败的情况。
简单的处理方法是:先参考我的文章:python检查点的简单实现。先做个检查点。然后使用将在True时运行异常的代码。参见下面的伪代码:
def Download_auto(downloadlist,fun,sleep_time=15):
虽然正确:
尝试:#外包一层尝试
Value=fun (downloadlist,sleep _ time) # Fun这里是你的下载函数,我以函数指针的形式传入。
#只有正常执行才能退出。
if value==Util。成功:
破裂
除非:#如果出现10054或IOError或XXXError
Sleep_time=5 #睡眠5秒,重新执行上面的下载。由于检查点的原因,上述程序将从抛出异常的地方继续执行。防止了因网络连接不稳定而导致的节目中断。
打印('延长睡眠时间:',sleep_time)
但是,如果你找不到相应的网页,你就得做点别的:
#打印下载信息
def reporthook(块读取、块大小、总大小):
如果不是blocks_read:
打印(“连接已打开”)
如果total_size为0:
打印('读取%d个块' % blocks_read ')
否则:
#如果找不到,则该页面不存在。可能totalsize是0,百分比无法计算。
打印('下载:%d MB,总大小:% d MB ' %(blocks _ read * block _ size/1048576.0,总大小/1048576.0))
定义下载(路径,url):
# URL=' http://downloads . SourceForge . net/SourceForge/Alliance P2P/Alliance-v 1 . 0 . 6 . jar '
#filename=url.rsplit('/')[-1]
尝试:
# python自带的下载功能
urllib.request.urlretrieve(url,path,reporthook)
除了IOError为e: #如果找不到,好像抛出IOError。
打印('下载',url,'/n错误:',e)
打印('完成:% s/n复制到:%s' %(url,路径))
如果您仍然遇到问题.请在评论中注明其他解决方案。
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。