>>> from env_helper import info; info()
页面更新时间: 2024-01-20 17:17:08
运行环境:
    Linux发行版本: Debian GNU/Linux 12 (bookworm)
    操作系统内核: Linux-6.1.0-17-amd64-x86_64-with-glibc2.36
    Python版本: 3.11.2

4.3. 将下载的文件保存到硬盘

现在,可以用标准的 open() 函数和 write() 方法,将Web页面保存到硬盘中的一个文件。 但是,这里稍稍有一点不同。 首先,必须用“写二进制”模式打开该文件,即向函数传入字符串 'wb' ,作为 open() 的第二参数。 即使该页面是纯文本的(例如前面下载的罗密欧与朱丽叶的文本),你也需要写入二进制数据,而不是文本数据, 目的是为了保存该文本中的“Unicode编码”。

Unicode 编码超出了本书的范围, 但你可以通过以下网页了解更多的相关内容:

为了将Web页面写入到一个文件,可以使用 for 循环和 Response 对象的 iter_content() 方法。

>>> import requests
>>> res = requests.get('http://www.gutenberg.org/cache/epub/1112/pg1112.txt')
>>> res.raise_for_status()
>>> playFile = open('xx_RomeoAndJuliet.txt', 'wb')
>>> for chunk in res.iter_content(100000):
>>>     playFile.write(chunk)
>>> playFile.close()

iter_content() 方法在循环的每次迭代中,返回一段内容。 每一段都是 bytes 数据类型,你需要指定一段包含多少字节。 10万字节通常是不错的选择,所以将100000作为参数传递给 iter_content()

文件 RomeoAndJuliet.txt 将存在于当前工作目录。 请注意,虽然在网站上文件名是 pglll2.txt , 但在你的硬盘上,该文件的名字不同。 requests 模块 只处理下载网页内容。一旦网页下载后,它就只是程序中的数据。 即使在下载该网页后断开了因特网连接,该页面的所有数据仍然 会在你的计算机中。

write() 方法返回一个数字,表示写入文件的字节数。 在前面的例子中,第一段包含100000个字节,文件剩下的部 分只需要78981个字节。

回顾一下,下载并保存到文件的完整过程如下:

  1. 调用 requests.get() 下载该文件。

  2. 'W' 调用 open() ,以写二进制的方式打开一个新文件。

  3. 利用 Respose 对象的 iter_content() 方法做循环。

  4. 在每次迭代中调用 write() ,将内容写入该文件。

  5. 调用 close() 关闭该文件。

这就是关于 requests 模块的全部内容!相对于写入文本文件的 open() / write()/ close()工作步骤, for 循环和 iter_content() 的部分可能看起来比较复杂,但这是为了确保 requests 模块即使在下载巨大的文件时也不会消耗太多内存。 你可以访问 http://requests.readthedocs.org/ 了解 requests 模块的其他功能。