【问题标题】:How to download a file from an url and keep its name and metadata with python requests如何从 url 下载文件并使用 python 请求保留其名称和元数据
【发布时间】: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'

【问题讨论】:

标签: python python-requests


【解决方案1】:

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

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

【讨论】:

  • 此标头不可用
【解决方案2】:

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

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

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

参考:

  1. 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”,而不是请求标头中的默认值。
猜你喜欢
  • 1970-01-01
  • 2016-04-02
  • 1970-01-01
  • 2019-11-18
  • 1970-01-01
  • 2015-06-09
  • 2020-11-19
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多