使用Python并发下载一个文件的多个部分?
我知道怎么用 urllib
来下载一个文件。不过,如果服务器允许的话,同时下载同一个文件的几个部分会快很多,然后再把这些部分合并起来。
那么在Python中怎么做到这一点呢?如果用标准库做起来不太方便,有没有其他的库可以帮你实现这个功能?
2 个回答
18
虽然我同意Gregory建议使用现有的库,但值得注意的是,你也可以通过使用Range
这个HTTP头来实现。如果服务器支持字节范围请求,你可以开启多个线程来并行下载文件的不同部分。例如,这段代码只会下载指定文件的前65536个字节:
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'
)。
6
PycURL 可以做到这一点。PycURL 是一个 Python 接口,用来和 libcurl 这个库进行交互。它可以用来从 Python 程序中获取通过 URL 指定的对象,这和 urllib 这个 Python 模块的功能类似。PycURL 已经很成熟,速度非常快,并且支持很多功能。