如何从 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 请求保留其名称和元数据的主要内容,如果未能解决你的问题,请参考以下文章