我试图从网站下载PDF文件并将其保存到磁盘.我的尝试要么失败,要么编码错误,要么导致空白PDF.
In [1]: import requests In [2]: url = 'http://www.hrecos.org//images/Data/forweb/HRTVBSH.Metadata.pdf' In [3]: response = requests.get(url) In [4]: with open('/tmp/metadata.pdf', 'wb') as f: ...: f.write(response.text) --------------------------------------------------------------------------- UnicodeEncodeError Traceback (most recent call last)in () 1 with open('/tmp/metadata.pdf', 'wb') as f: ----> 2 f.write(response.text) 3 UnicodeEncodeError: 'ascii' codec can't encode characters in position 11-14: ordinal not in range(128) In [5]: import codecs In [6]: with codecs.open('/tmp/metadata.pdf', 'wb', encoding='utf8') as f: ...: f.write(response.text) ...:
我知道这是某种编解码器问题,但我似乎无法让它工作.
response.content
在这种情况下你应该使用:
with open('/tmp/metadata.pdf', 'wb') as f: f.write(response.content)
从文件:
对于非文本请求,您还可以以字节为单位访问响应正文:
>>> r.content b'[{"repository":{"open_issues":0,"url":"https://github.com/...
这意味着:response.text
将输出作为字符串对象返回,在下载文本文件时使用它.如HTML文件等
并将response.content
输出作为bytes对象返回,在下载二进制文件时使用它.如PDF文件,音频文件,图像等
您还可以使用response.raw
代替.但是,当您要下载的文件很大时使用它.以下是您可以在文档中找到的基本示例:
import requests url = 'http://www.hrecos.org//images/Data/forweb/HRTVBSH.Metadata.pdf' r = requests.get(url, stream=True) with open('/tmp/metadata.pdf', 'wb') as fd: for chunk in r.iter_content(chunk_size): fd.write(chunk)
chunk_size
是您要使用的块大小.如果将其设置为2000
,则请求将下载该文件的第一个2000
字节,将它们写入文件,并一次又一次地执行此操作,除非它完成.
所以这可以节省你的RAM.但我更喜欢response.content
在这种情况下使用,因为你的文件很小.如您所见,使用response.raw
很复杂.
涉及:
如何使用requests.py在python中下载大文件?
如何使用请求下载图像
在Python 3中,我发现pathlib是执行此操作的最简单方法。请求的response.content与pathlib的_write_bytes_很好地结合在一起。
from pathlib import Path import requests filename = Path('metadata.pdf') url = 'http://www.hrecos.org//images/Data/forweb/HRTVBSH.Metadata.pdf' response = requests.get(url) filename.write_bytes(response.content)