ISP的24小时断开暂停下载永久

时间:2013-09-24 09:02:06

标签: python urllib2 urllib disconnect

我的ISP每天都会强行断开我的连接。如果在下载过程中发生这种情况,则下载只会暂停,而不会抛出任何异常。

现在我只能考虑线程化下载,然后检查最长时间或者现在读取文件大小,然后检查它是否仍在增长。

我现在正在使用的功能:

def download_with_progress(url,localFileName,overwrite=False):
    if not os.path.exists(localFileName) or overwrite == True:
        urlretrieve(url, localFileName, reporthook=print_progress)
        sys.stdout.write("\r") #remove previously printed percent sign
        sys.stdout.flush()

def print_progress(count, blockSize, totalSize):
    total_MB = (totalSize) / (1000 * 1000)
    current_MB = (blockSize * count) / (1000 * 1000)
    percent = int(count*blockSize*100/totalSize)        
    sys.stdout.write("\r%d%% (%d/%d MB)" % (percent, current_MB, total_MB))
    sys.stdout.flush()

由于我已经在这里:total_MBcurrent_MB正确计算了这种方式吗?或者我应该除以1024 * 1024?我将它们显示为四舍五入,因此它不是一个真正的问题。

1 个答案:

答案 0 :(得分:2)

不使用urllib2,而是使用requests library;它设置了TCP Keep-Alive option,让您检测到ISP断开连接。

您可能需要设置其他套接字选项; urllib3库使用select来检测套接字是否仍然可用,并设置超时,但是向套接字添加显式KEEPALIVE选项应该使检测更加平滑:

import httplib
import socket

orig_connect = httplib.HTTPConnection.connect
def new_connect(self):
    orig_connect(self)
    self.sock.setsockopt(socket.SOL_SOCKET, socket.SO_KEEPALIVE, 1)
httplib.HTTPConnection.connect = new_connect