我有一个指向二进制文件的URL,我需要在检查其大小后下载,因为只有当本地文件大小与远程文件大小不同时,才应(重新)执行下载。
这是它的工作原理(匿名主机名和IP):wget
$ wget <URL>
--2020-02-17 11:09:18-- <URL>
Resolving <URL> (<host>)... <IP>
Connecting to <host> (<host>)|<ip>|:443... connected.
HTTP request sent, awaiting response... 200 OK
Length: 31581872 (30M) [application/x-gzip]
Saving to: ‘[...]’
这也适用于该标志以恢复下载,包括跳过之前完全下载的文件。--continue
我可以做同样的事情,也存在:curlcontent-length
$ curl -I <url>
HTTP/2 200
date: Mon, 17 Feb 2020 13:11:55 GMT
server: Apache/2.4.25 (Debian)
strict-transport-security: max-age=15768000
last-modified: Fri, 14 Feb 2020 15:42:29 GMT
etag: "[...]"
accept-ranges: bytes
content-length: 31581872
vary: Accept-Encoding
content-type: application/x-gzip
在Python中,我尝试通过使用请求库检查标头来实现相同的逻辑:Content-length
with requests.get(url, stream=True) as response:
total_size = int(response.headers.get("Content-length"))
if not response.ok:
logger.error(
f"Error {response.status_code} when downloading file from {url}"
)
elif os.path.exists(file) and os.stat(file).st_size == total_size:
logger.info(f"File '{file}' already exists, skipping download.")
else:
这个逻辑对于其他URL来说工作正常,即我确实得到了标题。Content-length
当使用(省略)时,我得到相同的标头,除了.requests.head(url)stream=TrueTransfer-Encoding
我知道服务器不必发送标头。但是,显然确实得到了该标头。它们与我的Python实现有什么不同?Content-lengthwgetcurl
婷婷同学_
相关分类