- 内容提要
- 作者简介
- 技术评审者简介
- 致谢
- 译者序 会编程的人不一样
- 前言
- 本书的读者对象
- 编码规范
- 什么是编程
- 本书简介
- 下载和安装 Python
- 启动 IDLE
- 如何寻求帮助
- 聪明地提出编程问题
- 小结
- 第一部分 Python 编程基础
- 第1章 Python 基础
- 第2章 控制流
- 第3章 函数
- 第4章 列表
- 第5章 字典和结构化数据
- 第6章 字符串操作
- 第二部分 自动化任务
- 第7章 模式匹配与正则表达式
- 第8章 读写文件
- 第9章 组织文件
- 第10章 调试
- 第11章 从 Web 抓取信息
- 第12章 处理 Excel 电子表格
- 第13章 处理 PDF 和 Word 文档
- 第14章 处理 CSV 文件和 JSON 数据
- 第15章 保持时间、计划任务和启动程序
- 第16章 发送电子邮件和短信
- 第17章 操作图像
- 第18章 用 GUI 自动化控制键盘和鼠标
- 附录A 安装第三方模块
- 附录B 运行程序
- 附录C 习题答案
11.3 将下载的文件保存到硬盘
现在,可以用标准的open()函数和write()方法,将Web页面保存到硬盘中的一个文件。但是,这里稍稍有一点不同。首先,必须用“写二进制”模式打开该文件,即向函数传入字符串'wb',作为open()的第二参数。即使该页面是纯文本的(例如前面下载的罗密欧与朱丽叶的文本),你也需要写入二进制数据,而不是文本数据,目的是为了保存该文本中的“Unicode编码”。
Unicode编码
Unicode编码超出了本书的范围,但你可以通过以下网页了解更多的相关内容:
· Joel on Software: The Absolute Minimum Every Software Developer Absolutely, Positively Must Know About Unicode and Character Sets (No Excuses!): http://www.joelonsoftware.com/articles/Unicode.html
· Pragmatic Unicode: http://nedbatchelder.com/text/unipain.html
为了将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('RomeoAndJuliet.txt', 'wb') >>> for chunk in res.iter_content(100000): playFile.write(chunk) 100000 78981 >>> playFile.close()
iter_content()方法在循环的每次迭代中,返回一段内容。每一段都是bytes数据类型,你需要指定一段包含多少字节。10万字节通常是不错的选择,所以将100000作为参数传递给iter_content()。
文件RomeoAndJuliet.txt将存在于当前工作目录。请注意,虽然在网站上文件名是pg1112.txt,但在你的硬盘上,该文件的名字不同。requests模块只处理下载网页内容。一旦网页下载后,它就只是程序中的数据。即使在下载该网页后断开了因特网连接,该页面的所有数据仍然会在你的计算机中。
write()方法返回一个数字,表示写入文件的字节数。在前面的例子中,第一段包含100000个字节,文件剩下的部分只需要78981个字节。
回顾一下,下载并保存到文件的完整过程如下:
1.调用requests.get()下载该文件。
2.用'wb'调用open(),以写二进制的方式打开一个新文件。
3.利用Respose对象的iter_content()方法做循环。
4.在每次迭代中调用write(),将内容写入该文件。
5.调用close()关闭该文件。
这就是关于requests模块的全部内容!相对于写入文本文件的open()/write()/ close()工作步骤,for循环和iter_content()的部分可能看起来比较复杂,但这是为了确保requests模块即使在下载巨大的文件时也不会消耗太多内存。你可以访问http://requests.readthedocs.org/,了解requests模块的其他功能。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论