0

ISP が 1 日に 1 回、接続を強制的に切断します。ダウンロード中にそれが発生した場合、ダウンロードは例外をスローすることなく、永久に一時停止します。

今のところ、ダウンロードをスレッド化し、最大時間を確認するか、ファイルサイズをすべて読み取ってから、まだ成長しているかどうかを確認することしか考えられませんでした。

私が今使っている機能:

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_MBか、current_MB正しく計算されていますか? それとも で割るべき1024 * 1024ですか?丸めた整数で表示していますので、特に問題ありません。

4

1 に答える 1

2

を使用する代わりにurllib2requestsライブラリを使用してください。TCP Keep-Alive オプションを設定して、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
于 2013-09-24T09:07:04.447 に答える