,,python socket 超时设置 errno 10054

,,python socket 超时设置 errno 10054

本文主要介绍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的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

留言与评论(共有 条评论)
   
验证码: