为了账号安全,请及时绑定邮箱和手机立即绑定

内容长度在 Curl、Wget 中可用,但在 Python 请求中不可用

内容长度在 Curl、Wget 中可用,但在 Python 请求中不可用

猛跑小猪 2022-08-02 16:07:09
我有一个指向二进制文件的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 OKLength: 31581872 (30M) [application/x-gzip]Saving to: ‘[...]’这也适用于该标志以恢复下载,包括跳过之前完全下载的文件。--continue我可以做同样的事情,也存在:curlcontent-length$ curl -I <url>HTTP/2 200 date: Mon, 17 Feb 2020 13:11:55 GMTserver: Apache/2.4.25 (Debian)strict-transport-security: max-age=15768000last-modified: Fri, 14 Feb 2020 15:42:29 GMTetag: "[...]"accept-ranges: bytescontent-length: 31581872vary: Accept-Encodingcontent-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
查看完整描述

1 回答

?
婷婷同学_

TA贡献1844条经验 获得超8个赞

这不是对缺少标头的问题的真正答案,而是对潜在问题的解决方案:Content-length

我没有检查本地文件大小与远程内容长度,而是检查了标头并将其与本地文件进行比较。在(不太可能)远程文件已更新但仍具有完全相同大小的情况下,这也更安全。Last-modifiedmtime


查看完整回答
反对 回复 2022-08-02
  • 1 回答
  • 0 关注
  • 181 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信