无需下载即可获得pdf的大小

bha*_*esh 3 python request http-headers

有没有可能知道pdf的大小,例如http://example.com/ABC.pdf使用python中的请求模块而不实际下载它.我正在写一个应用程序,如果互联网速度很慢,如果pdf的大小很大,那么它将推迟下载以备将来使用

Jan*_*sky 9

使用HTTP-HEAD请求

响应应在头文件中提供要下载的文件的更多详细信息,而无需获取完整文件.

>>> url = "http://www.pdf995.com/samples/pdf.pdf"
>>> req = requests.head(url)
>>> req.content
''
>>> req.headers["content-length"]
'433994'
Run Code Online (Sandbox Code Playgroud)

或尝试流式读取

>>> req = requests.get(url, stream=True)
>>> res = req.iter_content(30)
>>> res
<generator object generate at 0x7f9ad3270320>
>>> res.next()
'%PDF-1.3\n%\xc7\xec\x8f\xa2\n30 0 obj\n<</Len'
>>> res.next()
'gth 31 0 R/Filter /FlateDecode'
>>> res.next()
'>>\nstream\nx\x9c\xed}\xdd\x93%\xb7m\xef\xfb\xfc\x15S\xf7%NU\xf6\xb8'
Run Code Online (Sandbox Code Playgroud)

然后,您可以从初始pdf文件字节解码pdf大小,并决定是否继续.

使用范围请求标头

HTTP允许仅检索检索字节范围.

如果您的服务器支持,您可以使用技巧,您要求的字节范围只有太大的文件才可用.如果你得到一些字节(并且状态正常),你知道,文件太大了.

如果您遇到异常ChunkedEncodingError: IncompleteRead(0 bytes read),那么您知道,文件较小.

像这样称呼它:

>>> headers = {"Range": "bytes=999500-999600"}
>>> req = requests.get(url, headers=headers)
Run Code Online (Sandbox Code Playgroud)

如果您的服务器允许提供部分内容,这将仅起作用.


eme*_*eth 7

像这样

import urllib2
response = urllib2.urlopen('http://example.com/ABC.pdf')
size_of_pdf = response.headers['Content-Length']
Run Code Online (Sandbox Code Playgroud)

response.read()调用之前,不会下载内容.

Response Headers维基百科中查看一下

...
Content-Length  The length of the response body in octets (8-bit bytes) Content-Length: 348 Permanent
...
Run Code Online (Sandbox Code Playgroud)

OP要求使用requests,所以@JanVlcinsky的答案更合适.