- 内容提要
- 作者简介
- 技术评审者简介
- 致谢
- 译者序 会编程的人不一样
- 前言
- 本书的读者对象
- 编码规范
- 什么是编程
- 本书简介
- 下载和安装 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.2 用 requests 模块从 Web 下载文件
requests模块让你很容易从Web下载文件,不必担心一些复杂的问题,诸如网络错误、连接问题和数据压缩。requests模块不是Python自带的,所以必须先安装。通过命令行,运行pip install requests(附录A详细介绍了如何安装第三方模块)。
编写requests模块是因为Python的urllib2模块用起来太复杂。实际上,请拿一支记号笔涂黑这一段。忘记我曾提到urllib2。如果你需要从Web下载东西,使用requests模块就好了。
接下来,做一个简单的测试,确保requests模块已经正确安装。在交互式环境中输入以下代码:
>>> import requests
如果没有错误信息显示,requests模块就已经安装成功了。
11.2.1 用requests.get()函数下载一个网页
requests.get()函数接受一个要下载的URL字符串。通过在requests.get()的返回值上调用type(),你可以看到它返回一个Response对象,其中包含了Web服务器对你的请求做出的响应。稍后我将更详细地解释Response对象,但现在请在交互式环境中输入以下代码,并保持计算机与因特网的连接:
>>> import requests ❶ >>> res = requests.get('http://www.gutenberg.org/cache/epub/1112/pg1112.txt') >>> type(res) <class 'requests.models.Response'> ❷ >>> res.status_code == requests.codes.ok True >>> len(res.text) 178981 >>> print(res.text[:250]) The Project Gutenberg EBook of Romeo and Juliet, by William Shakespeare This eBook is for the use of anyone anywhere at no cost and with almost no restrictions whatsoever. You may copy it, give it away or re-use it under the terms of the Proje
该URL指向一个文本页面,其中包含整部罗密欧与朱丽叶,它是由古登堡计划❶提供的。通过检查Response对象的status_code属性,你可以了解对这个网页的请求是否成功。如果该值等于requests.codes.ok,那么一切都好❷(顺便说一下,HTTP协议中“OK”的状态码是200。你可能已经熟悉404状态码,它表示“没找到”)。
如果请求成功,下载的页面就作为一个字符串,保存在Response对象的text变量中。这个变量保存了包含整部戏剧的一个大字符串,调用len(res.text)表明,它的长度超过178000个字符。最后,调用print(res.text[:250])显示前250个字符。
11.2.2 检查错误
正如你看到的,Response对象有一个status_code属性,可以检查它是否等于requests.codes.ok,了解下载是否成功。检查成功有一种简单的方法,就是在Response对象上调用raise_for_status()方法。如果下载文件出错,这将抛出异常。如果下载成功,就什么也不做。在交互式环境中输入以下代码:
>>> res = requests.get('http://inventwithpython.com/page_that_does_not_exist') >>> res.raise_for_status() Traceback (most recent call last): File "<pyshell#138>", line 1, in <module> res.raise_for_status() File "C:\Python34\lib\site-packages\requests\models.py", line 773, in raise_for_status raise HTTPError(http_error_msg, response=self) requests.exceptions.HTTPError: 404 Client Error: Not Found
raise_for_status()方法是一种很好的方式,确保程序在下载失败时停止。这是一件好事:你希望程序在发生未预期的错误时,马上停止。如果下载失败对程序来说不够严重,可以用try和except语句将raise_for_status()代码行包裹起来,处理这一错误,不让程序崩溃。
import requests res = requests.get('http://inventwithpython.com/page_that_does_not_exist') try: res.raise_for_status() except Exception as exc: print('There was a problem: %s' % (exc))
这次raise_for_status()方法调用导致程序输出以下内容:
There was a problem: 404 Client Error: Not Found
总是在调用requests.get()之后再调用raise_for_status()。你希望确保下载确实成功,然后再让程序继续。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论