Python URLRetrieve Limit Rate и возобновление частичной загрузки

Я использую код из this thread, чтобы ограничить скорость загрузки.

Как включить частичное возобновление загрузки с кодом ограничения скорости? В найденных мной примерах используется 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)

person Lionel    schedule 26.12.2010    source источник
comment
Не дублируется, потому что: urllib.urlretrieve может ограничивать скорость с помощью класса RateLimit. urllib2.urlopen может возобновлять файлы, но не может ограничивать скорость. Нужен способ совместить как ограничение скорости, так и возобновление файла   -  person Lionel    schedule 26.12.2010


Ответы (1)


Вместо этого можно использовать 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()
person Lionel    schedule 26.12.2010