【问题标题】:Get file size using python-requests, while only getting the header使用 python-requests 获取文件大小,同时只获取标题
【发布时间】:2013-01-11 02:27:19
【问题描述】:

我查看了请求文档,但似乎找不到任何东西。如何只请求标头,以便评估文件大小?

【问题讨论】:

    标签: python python-requests


    【解决方案1】:

    发送HEAD request:

    >>> import requests
    >>> response = requests.head('http://example.com')
    >>> response.headers
        {'connection': 'close',
     'content-encoding': 'gzip',
     'content-length': '606',
     'content-type': 'text/html; charset=UTF-8',
     'date': 'Fri, 11 Jan 2013 02:32:34 GMT',
     'last-modified': 'Fri, 04 Jan 2013 01:17:22 GMT',
     'server': 'Apache/2.2.3 (CentOS)',
     'vary': 'Accept-Encoding'}
    

    HEAD 请求类似于仅下载标头的 GET 请求。请注意,实际上是否满足您的 HEAD 请求取决于服务器。有些服务器只会响应 GET 请求,因此您必须发送 GET 请求并关闭连接而不是下载正文。其他时候,服务器从不指定文件的总大小。

    【讨论】:

    • 请注意,并非每个响应都必须包含content-length--有时响应是使用Transfer-Encoding: chunked 生成的,在这种情况下,除非您实际得到响应,否则无法知道响应会持续多长时间整个响应。
    • 这与使用 urllib.urlopen(url).info()['content-length'] 检索到的大小不同,所以不是我想要的。
    • 如果响应标头中没有 content-length 怎么办?
    【解决方案2】:

    使用requests.get(url, stream=True).headers['Content-length']

    stream=True 表示函数返回时,只下载响应头,不下载响应体

    requests.getrequest.head 都可以获得标题,但使用 get 有一个优势

    1. get 更灵活,如果你想在检查长度后下载响应正文,你可以简单地访问 content 属性或使用 iterator 开始,它将以块的形式下载内容
    2. “HEAD 请求应该与响应 GET 请求时发送的信息相同。” 但并非总是如此。

    这里是一个获取MIT open course video长度的例子

    MitOpenCourseUrl = "http://www.archive.org/download/MIT6.006F11/MIT6_006F11_lec01_300k.mp4"
    resHead = requests.head(MitOpenCourseUrl)
    resGet = requests.get(MitOpenCourseUrl,stream=True)
    resHead.headers['Content-length'] # output 169
    resGet.headers['Content-length'] # output 121291539
    

    【讨论】:

    • Relevant note 来自 Requests 的文档:“如果您在发出请求时将 stream 设置为 True,除非您消耗所有数据或调用,否则 Requests 无法将连接释放回池中Response.close。这可能会导致连接效率低下。如果您在使用 stream=True 时发现自己部分读取请求正文(或根本不读取它们),您应该在 with 语句中发出请求以确保它始终关闭"
    【解决方案3】:

    获取文件大小 -->

    file.headers.get('Content-Length')
    

    【讨论】:

    • 问题是关于Requests 库(请参阅标题和python-requests 标记)以及如何在客户端 上使用它来从端点请求标头.这个 request.FILES 不同,它看起来像是框架 (Django?) 的一部分,并且是服务器端来处理接收到的请求。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-10-15
    • 1970-01-01
    • 1970-01-01
    • 2023-03-07
    • 1970-01-01
    相关资源
    最近更新 更多