如何从 url 下载文件并使用 python 请求保留其名称和元数据

Posted

技术标签:

【中文标题】如何从 url 下载文件并使用 python 请求保留其名称和元数据【英文标题】:How to download a file from an url and keep its name and metadata with python requests 【发布时间】:2016-10-20 12:09:15 【问题描述】:

如果我在浏览器中单击下载按钮,将下载一个文件及其原始名称和元数据。

目前我可以使用 python 请求下载文件,但我必须给它一个名称,并且下载的文件中没有任何元数据可用。

我要下载的文件具有有意义的名称,但这些名称不是 url 的一部分。

用 python 最好的方法是什么?

响应中只有这些标头:

服务器 日期 内容类型 连接 变化 X-Powered-By 编译指示 设置 Cookie 过期 缓存控制 链接 内容编码

Content-Disposition 标头在r.headers 中不可用,但如果我在浏览器中下载文件,我可以看到它。

Traceback (most recent call last):
  File "download.py", line 53, in <module>
    print r.headers["Content-Disposition"]
  File "/Users/raitis.dembovskis/.virtualenvs/webcrawler/lib/python2.7/site-packages/requests/structures.py", line 54, in __getitem__
    return self._store[key.lower()][1]
KeyError: 'content-disposition'

【问题讨论】:

How to get pdf filename with Python requests?的可能重复 【参考方案1】:

只有在该url的头部有文件名信息时才可以这样做:

result.urllib2.urlopen(url)
result.headers['content-disposition']
or
result.info()

【讨论】:

此标头不可用【参考方案2】:

文件名由服务器使用 Content-Disposition 标头设置如下:

Content-Disposition: attachment; filename="downloaded.pdf"

所以,尝试从标题中读取并提取标题中给出的文件名并使用它。

参考:

    How to set name of file downloaded from browser?

【讨论】:

此标头不可用 使用网络嗅探工具(burp 套件、Wireshark)或浏览器(F12 -> 网络选项卡)捕获请求并检查标头。浏览器使用标题为文件命名。所以,它应该存在。 此标头存在于浏览器中,但如果我检查 'response.headers' 它不存在 它是可公开访问的 url(下载)吗?如果是,请与我们分享,将尝试。或分享相似的网址 尝试使用浏览器 User-Agent 标头,例如“Mozilla/5.0 (Windows NT 6.1; WOW64; rv:49.0) Gecko/20100101 Firefox/49.0”,而不是请求标头中的默认值。

以上是关于如何从 url 下载文件并使用 python 请求保留其名称和元数据的主要内容,如果未能解决你的问题,请参考以下文章

无法使用python从URL下载文件

python多线程下载文件

url重定向时如何使用Powershell从Web下载文件

如何使用 Python 从指向子 URL 的 URL 下载 pdf 文件

如何在Python中下载大文件?

下载一个 zip 文件并使用 Python3 将其提取到内存中