如何使用Python urllib2下载分块数据

时间:2014-06-24 18:30:16

标签: python download urllib2 chunked transfer-encoding

我正在尝试使用Python 2从服务器下载大文件:

req = urllib2.Request("https://myserver/mylargefile.gz")
rsp = urllib2.urlopen(req)
data = rsp.read()

服务器使用“Transfer-Encoding:chunked”发送数据,而我只获得一些二进制数据,这些数据无法通过gunzip解压缩。

我必须迭代多个read()吗?还是多个请求?如果是这样,他们怎么样?

注意:我正在尝试仅使用Python 2标准库来解决问题,而不需要其他库,例如urllib3或请求。这甚至可能吗?

3 个答案:

答案 0 :(得分:1)

如果我没弄错的话,以下内容对我有用 - 前一段时间:

data = ''
chunk = rsp.read()
while chunk:
    data += chunk
    chunk = rsp.read()

每个read读取一个块 - 所以继续阅读,直到没有更多的东西到来。 尚未准备好支持此文件的文件......

答案 1 :(得分:0)

来自urllib2.urlopen上的python文档:

  

一个警告:read()方法,如果省略size参数或   否定,直到数据流结束才可能读取;没有   确定来自套接字的整个流的好方法   在一般情况下阅读。

所以,循环读取数据:

req = urllib2.Request("https://myserver/mylargefile.gz")
rsp = urllib2.urlopen(req)
data = rsp.read(8192)
while data:
   # .. Do Something ..
   data = rsp.read(8192)

答案 2 :(得分:0)

我有同样的问题。

我发现“传输编码:分块”通常与“内容编码: gzip”。

所以也许我们可以获得压缩的内容并解压缩。

对我有用。

import urllib2
from StringIO import StringIO
import gzip

req = urllib2.Request(url)
req.add_header('Accept-encoding', 'gzip, deflate')
rsp = urllib2.urlopen(req)
if rsp.info().get('Content-Encoding') == 'gzip':
    buf = StringIO(rsp.read())
    f = gzip.GzipFile(fileobj=buf)
    data = f.read()