Хотя я согласен с предложением Грегори использовать существующую библиотеку, стоит отметить, что вы можете сделать это, используя HTTP-заголовок Range
. Если сервер принимает запросы в диапазоне байтов, вы можете запустить несколько потоков для параллельной загрузки нескольких частей файла. Этот фрагмент, например, будет загружать только байты 0..65535 указанного файла:
import urllib2
url = 'http://example.com/test.zip'
req = urllib2.Request(url, headers={'Range':'bytes=0-65535'})
data = urllib2.urlopen(req).read()
Вы можете определить размер удаленного ресурса и посмотреть, поддерживает ли сервер удаленные запросы, отправив запрос HEAD:
import urllib2
class HeadRequest(urllib2.Request):
def get_method(self):
return "HEAD"
url = 'http://sstatic.net/stackoverflow/img/sprites.png'
req = HeadRequest(url)
response = urllib2.urlopen(req)
response.close()
print respose.headers
Вышеуказанные отпечатки:
Cache-Control: max-age=604800
Content-Length: 16542
Content-Type: image/png
Last-Modified: Thu, 10 Mar 2011 06:13:43 GMT
Accept-Ranges: bytes
ETag: "c434b24eeadecb1:0"
Date: Mon, 14 Mar 2011 16:08:02 GMT
Connection: close
Отсюда видно, что размер файла составляет 16542 байта ('Content-Length'
), а сервер поддерживает диапазоны байтов ('Accept-Ranges: bytes'
).