我正在使用urllib3抓取网页。示例代码:
from urllib3 import PoolManager
pool = PoolManager()
response = pool.request("GET", url)
问题是我可能偶然发现了一个下载非常大的文件的网址,而且我并没有下载它。
我发现了这个问题 - Link - 它建议使用urllib
和urlopen
。我不想两次联系服务器。
我想将文件大小限制为25MB。
有没有办法可以用urllib3
做到这一点?
答案 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()