python远程主机强行关闭了现有的连接套接字超时设置errno 10054
python socket.error:[Errno 10054]现有连接被远程主机强行关闭。问题解决方法:
几天前,我使用python来读取网页。由于网站上使用了大量urlopen操作,因此它将被该网站标识为攻击。有时,不再允许下载。造成urlopen()后,request.read()被卡在那里。最后,将抛出errno 10054.。
此错误是对等方重置连接。也就是说亚博电子竞技俱乐部 ,传奇的远程主机将重置连接。原因可能是套接字超时太长。也可能是在request = urllib.request.urlopen(url);之后没有执行request.close()操作;可能还有几秒钟没有睡眠,这使该网站认为这种行为是攻击。
具体解决方案如下代码:
import socket import time timeout = 20 socket.setdefaulttimeout(timeout)#这里对整个socket层设置超时时间。后续文件中如果再使用到socket,不必再设置 sleep_download_time = 10 time.sleep(sleep_download_time) #这里时间自己设定 request = urllib.request.urlopen(url)#这里是要读取内容的url content = request.read()#读取,一般会在这里报异常 request.close()#记得要关闭
因为urlopen之后的read()操作实际上调用了套接字层的某些函数。因此凤凰彩票app ,通过设置默认的套接字超时时间,网络可以自行断开连接。无需在read()上永远等待。
当然暴龙电竞 ,您也可以编写一些try和aspnet 远程主机强迫关闭了一个现有的连接ag真人 ,除了在外层,例如:
try: time.sleep(self.sleep_download_time) request = urllib.request.urlopen(url) content = request.read() request.close() except UnicodeDecodeError as e: print('-----UnicodeDecodeError url:',url) except urllib.error.URLError as e: print("-----urlError url:",url) except socket.timeout as e: print("-----socket timout:",url)
通常来说,没有问题。在我这么说之前,我测试了数千个网页的下载。但是,如果您下载了成千上万个文件,则我进行了测试aspnet 远程主机强迫关闭了一个现有的连接,ms仍然会跳出该异常。可能是time.sleep()的时间太短,或者网络突然中断了。我用urllib.request.retrieve()测试了它凤凰彩票app ,发现连续下载数据时,总会出现故障。
处理它的简单方法是:首先参考我的文章:python检查点的简单实现。首先执行检查点。然后,将上面的代码置为True时将用尽所有异常。请参见下面的伪代码:
ef Download_auto(downloadlist,fun,sleep_time=15): while True: try: # 外包一层try value = fun(downloadlist,sleep_time) # 这里的fun是你的下载函数,我当函数指针传进来。 # 只有正常执行方能退出。 if value == Util.SUCCESS: break except : # 如果发生了10054或者IOError或者XXXError sleep_time += 5 #多睡5秒,重新执行以上的download.因为做了检查点的缘故,上面的程序会从抛出异常的地方继续执行。防止了因为网络连接不稳定带来的程序中断。 print('enlarge sleep time:',sleep_time)
但是,如果找不到相应的网页,则需要另一个过程:
# 打印下载信息 def reporthook(blocks_read, block_size, total_size): if not blocks_read: print ('Connection opened') if total_size < 0: print ('Read %d blocks' % blocks_read) else: # 如果找不到,页面不存在,可能totalsize就是0,不能计算百分比 print('downloading:%d MB, totalsize:%d MB' % (blocks_read*block_size/1048576.0,total_size/1048576.0)) def Download(path,url): #url = 'http://downloads.sourceforge.net/sourceforge/alliancep2p/Alliance-v1.0.6.jar' #filename = url.rsplit("/")[-1] try: # python自带的下载函数 urllib.request.urlretrieve(url, path, reporthook) except IOError as e: # 如果找不到,好像会引发IOError。 print("download ",url,"/nerror:",e) print("Done:%s/nCopy to:%s" %(url,path))