Python | HTTP - 如何在下载之前检查文件大小

时间:2016-11-14 17:49:03

标签: python http urllib2 urllib urllib3

我正在使用urllib3抓取网页。示例代码:

from urllib3 import PoolManager

pool = PoolManager()
response = pool.request("GET", url)

问题是我可能偶然发现了一个下载非常大的文件的网址,而且我并没有下载它。

我发现了这个问题 - Link - 它建议使用urlliburlopen。我不想两次联系服务器。

我想将文件大小限制为25MB。 有没有办法可以用urllib3做到这一点?

1 个答案:

答案 0 :(得分:3)

如果服务器提供Content-Length标头,那么您可以使用它来确定是否要继续下载身体的其余部分。如果服务器没有提供标题,那么您需要流式传输响应,直到您决定不再继续。

为此,您需要确保自己是not preloading the full response

from urllib3 import PoolManager

pool = PoolManager()
response = pool.request("GET", url, preload_content=False)

# Maximum amount we want to read  
max_bytes = 1000000

content_bytes = response.headers.get("Content-Length")
if content_bytes and int(content_bytes) < max_bytes:
    # Expected body is smaller than our maximum, read the whole thing
    data = response.read()
    # Do something with data
    ...
elif content_bytes is None:
    # Alternatively, stream until we hit our limit
    amount_read = 0
    for chunk in r.stream():
        amount_read += len(chunk)
        # Save chunk
        ...
        if amount_read > max_bytes:
            break

# Release the connection back into the pool
response.release_conn()