返回介绍

11.2 用 requests 模块从 Web 下载文件

发布于 2024-01-22 21:44:06 字数 2682 浏览 0 评论 0 收藏 0

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 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文