Python URLRetrieve 限速和恢复部分下载
我正在使用来自这个讨论帖的代码来限制我的下载速度。
我想知道如何在限制下载速度的代码中加入支持断点续传的功能?我找到的例子都使用了urlopen
,而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)
1 个回答
4
也许可以试试用 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()