4

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

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

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

我是否必须遍历多个 read()s?还是多个请求?如果是这样,他们必须是什么样子?

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

4

3 回答 3

1

从 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)
于 2014-06-24T18:43:21.830 回答
1

如果我没记错的话,以下内容对我有用 - 不久前:

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

每个都read读取一个块 - 所以继续阅读,直到没有更多内容出现。还没有准备好支持这一点的文档……但是。

于 2014-06-24T18:43:23.200 回答
0

我也有同样的问题。

我发现“Transfer-Encoding: chunked”经常和“Content-Encoding: 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()
于 2019-10-24T15:21:22.243 回答