python - 使用 Python requests 模块下载并保存 PDF 文件

标签 python python-2.7 python-requests

我正在尝试从网站下载 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)
<ipython-input-4-4be915a4f032> in <module>()
      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)

来自 the document :

You can also access the response body as bytes, for non-text requests:

>>> r.content
b'[{"repository":{"open_issues":0,"url":"https://github.com/...

这意味着:response.text 将输出作为字符串对象返回,在下载文本文件 时使用它。如HTML文件等

并且 response.content 将输出作为字节对象返回,当您下载 二进制文件 时使用它。如PDF文件、音频文件、图片等


You can also use response.raw instead .但是,当您要下载的文件很大时使用它。下面是一个基本示例,您也可以在文档中找到它:

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 是您要使用的 block 大小。如果您将其设置为 2000,则 requests 将下载该文件的前 2000 个字节,将它们写入文件中,然后一遍又一遍地执行此操作,除非它完成.

所以这可以节省您的 RAM。但在这种情况下,我更喜欢使用 response.content ,因为您的文件很小。如您所见,使用 response.raw 很复杂。


相关:

关于python - 使用 Python requests 模块下载并保存 PDF 文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34503412/

相关文章:

python - 在python中将视频帧直接流式传输到youtube

python - Matplotlib 总是为每个绘图打开一个窗口,而不是仅仅将其写入文件

python - 如何确保输入键没有被输入到密码中

Python Flask 请求 400 错误代码

python - ModuleNotFoundError : No module named 'requests' using venv in vscode

python - 如何解决 -discord.http : We are being rate limited. 回复 429

python - Plotly:如何在 Spyder 中显示图表?

python - 同名的相对和绝对导入导致 "AttributeError: ' 模块'对象没有属性...”

windows - python : bad handshake error on get request when executed on windows but not linux

python - 如何在删除项目的同时循环遍历 Python 列表,直到没有剩余项目为止