使用Python并发下载一个文件的多个部分?

8 投票
2 回答
4970 浏览
提问于 2025-04-16 13:40

我知道怎么用 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 已经很成熟,速度非常快,并且支持很多功能。

撰写回答