使用Python同时下载一个文件的几个部分?

时间:2011-03-14 14:30:03

标签: python download

我知道如何使用urllib下载文件。但是,如果服务器允许,它会更快地同时下载同一文件的几个部分然后合并它们。

你是如何用Python做到的?如果你不能轻易地使用标准的lib,任何可以让你这样做的lib?

2 个答案:

答案 0 :(得分:17)

虽然我同意Gregory关于使用现有库的建议,但值得注意的是,您可以使用Range HTTP标头来执行此操作。如果服务器接受字节范围请求,您可以启动多个线程并行下载文件的多个部分。例如,此代码段仅下载指定文件的字节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')。

答案 1 :(得分:6)

PycURL可以做到。 PycURL是libcurl的Python接口。它可用于从Python程序中获取由URL标识的对象,类似于urllib Python模块。 PycURL成熟,速度非常快,并且支持许多功能。