Я услышал хорошие вещи [приблизительно 110] IKVM, JVM, которой это сделано с.NET.
Это довольно легко сделать, используя сокеты TCP и чистый HTTP. Соответствующий заголовок запроса - «Диапазон».
Пример запроса может выглядеть так:
mysock = connect(("www.example.com", 80))
mysock.write(
"GET /huge-growing-file HTTP/1.1\r\n"+\
"Host: www.example.com\r\n"+\
"Range: bytes=XXXX-\r\n"+\
"Connection: close\r\n\r\n")
Где XXXX представляет количество байтов, которые вы уже получили. Затем вы можете прочитать заголовки ответов и любой контент с сервера. Если сервер возвращает заголовок вроде:
Content-Length: 0
Вы знаете, что у вас есть весь файл.
Если вы хотите быть особенно хорошими в качестве HTTP-клиента, вы можете заглянуть в «Connection: keep-alive». Возможно, существует библиотека Python, которая делает все, что я описал (возможно, даже urllib2!), Но я не знаком с ней.
Можно выполнить частичную загрузку с использованием заголовка диапазона, следующий запрос будет запрашивать выбранный диапазон байтов:
req = urllib2.Request('http://www.python.org/')
req.headers['Range'] = 'bytes=%s-%s' % (start, end)
f = urllib2.urlopen(req)
Например:
>>> req = urllib2.Request('http://www.python.org/')
>>> req.headers['Range'] = 'bytes=%s-%s' % (100, 150)
>>> f = urllib2.urlopen(req)
>>> f.read()
'l1-transitional.dtd">\n\n\n<html xmlns="http://www.w3.'
С помощью этого заголовка вы можете возобновить частичные загрузки. В вашем случае все, что вам нужно сделать, это отслеживать уже загруженный размер и запрашивать новый диапазон.
Имейте в виду, что сервер должен принять этот заголовок, чтобы это работало.
Если я правильно понял ваш вопрос, файл не изменяется во время загрузки, а регулярно обновляется. Если это вопрос, то ответ будет rsync .
Если файл постоянно обновляется, в том числе во время загрузки, вам необходимо изменить rsync или программу BitTorrent. Они разбивают файлы на отдельные фрагменты и загружают или обновляют фрагменты независимо. Когда вы дойдете до конца файла с первой итерации, повторите, чтобы получить добавленный кусок; продолжайте по мере необходимости. С меньшей эффективностью можно было просто повторно выполнить rsync.