python urlretrieveの制限率と部分的なダウンロードを再開します
-
13-10-2019 - |
質問
からのコードを使用しています このスレッド ダウンロード率を制限するため。
レート制限コードで再開する部分的なダウンロードを組み込むにはどうすればよいですか?私が見つけた例 urlopen
それ以外の urlretrieve
, 、 そしてその RateLimit
クラスは依存します urlretrieve
.
変更する必要なく、部分的なダウンロードを制御する外部関数が欲しい RateLimit
クラス:
from throttle import TokenBucket, RateLimit
def retrieve_limit_rate(url, filename, rate_limit):
"""Fetch the contents of urls"""
bucket = TokenBucket(10*rate_limit, rate_limit)
print "rate limit = %.1f kB/s" % (rate_limit,)
print 'Downloading %s...' % filename
rate_limiter = RateLimit(bucket, filename)
#
# What do I put here to allow resuming files?
#
return urllib.urlretrieve(url, filename, rate_limiter)
解決
代わりにPycurlを使用できる場合があります。
def curl_progress(total, existing, upload_t, upload_d):
try:
frac = float(existing)/float(total)
except:
frac = 0
print "Downloaded %d/%d (%0.2f%%)" % (existing, total, frac)
def curl_limit_rate(url, filename, rate_limit):
"""Rate limit in bytes"""
import pycurl
c = pycurl.Curl()
c.setopt(c.URL, url)
c.setopt(c.MAX_RECV_SPEED_LARGE, rate_limit)
if os.path.exists(filename):
file_id = open(filename, "ab")
c.setopt(c.RESUME_FROM, os.path.getsize(filename))
else:
file_id = open(filename, "wb")
c.setopt(c.WRITEDATA, file_id)
c.setopt(c.NOPROGRESS, 0)
c.setopt(c.PROGRESSFUNCTION, curl_progress)
c.perform()
所属していません StackOverflow