当前位置: 首页 > 知识库问答 >
问题:

下载前使用与从urlopen检索到的HTTP头不匹配的HTTP头获取文件大小

宓博实
2023-03-14

为什么在使用请求urlopen(url)的情况下内容长度不同。info()

>>> url = 'http://pymotw.com/2/urllib/index.html'

>>> requests.head(url).headers.get('content-length', None)
'8176'
>>> urllib.urlopen(url).info()['content-length']
'38227'
>>> len(requests.get(url).content)
38274

我要检查文件的大小,以字节为单位,将缓冲区分割为多个线程基于urllib2中的Range,但如果我没有文件的实际大小,以字节为单位,它将无法工作。.

只有len(requests.get(url.content)给出了38274最接近但仍然不正确,而且它正在下载我不想要的内容。

共有1个答案

仲承福
2023-03-14

默认情况下,请求将发送'Accept-Encode':'gzip'作为请求头的一部分,服务器将用压缩内容进行响应:

>>> r = requests.head('http://pymotw.com/2/urllib/index.html')
r>>> r.headers['content-encoding'], r.headers['content-length']
('gzip', '8201')

但是,如果您手动设置请求标头,那么您将获得未压缩的内容:

>>> r = requests.head('http://pymotw.com/2/urllib/index.html',headers={'Accept-Encoding': 'identity'})
>>> r.headers['content-length']
'38227'
 类似资料:
  • 问题内容: 拨打电话时是否提取整个页面? 我只想读取HTTP响应标头而不获取页面。看起来像打开HTTP连接,然后随后获取实际的HTML页面……还是只是通过调用来开始缓冲页面? 问题答案: 使用该方法获取标题。 从urllib2文档: urllib2.urlopen(url [,data] [,timeout]) … 此函数返回带有两个其他方法的文件状对象: geturl()—返回所获取资源的URL

  • 问题内容: 我已经编写了一个PHP脚本来处理文件下载,确定请求哪个文件并设置正确的HTTP标头以触发浏览器实际下载文件(而不是在浏览器中显示文件)。 我现在遇到一个问题,一些用户报告了某些文件被错误标识(因此,无论扩展名如何,浏览器都将其视为GIF图像)。我猜这是因为我没有在响应头中设置“ Content-type”。这种情况最有可能吗?如果是这样,是否有一种相当通用的类型可用于所有文件,而不是尝

  • 问题内容: 是否有内置的方法通过node.js获取特定地址的标头? 就像是, 会回来 问题答案: 此示例代码应工作:

  • 问题是无法从$HTTP响应头中获取文件名 HTTP/1.1 200 OK 内容-长度:121257 内容-类型:Application/PDF 服务器:Microsoft-HTTPAPI/2.0 访问控制-允许-起源:* 访问控制-暴露-标头:* 内容-处置:附件;filename=order-414.pdf 日期:2015年2月11日星期三05:32:25 GMT 我只想在下载时获得文件名(or

  • 构建RESTful web服务endpoint,并考虑HTTP头状态与响应正文中找到的状态的最佳实践是什么。它们应该总是匹配的,还是可以是不同的?例如,在一个坏请求的情况下,实际上是我们的应用层对有效负载进行解析和处理。因此,在请求发送到应用层的情况下,HTTP报头是否显示200(表示传输没有问题),而响应体是否包含400(表示错误的请求)?还是他们应该一直匹配?头部和身体都有400? 多谢了。

  • 您只能使用HTTP HEAD请求报头,如中的选项。 冗长的HTML响应体在命令行中很难得到,所以我希望只得到标题作为POST请求的反馈。但是,头和岗是两种不同的方法。 如何使curl只显示POST请求的响应头?