requests 模块让你很容易从 Web 下载文件,不必担心一些复杂的问题,诸如网络错误、连接问题和数据压缩。requests 模块不是 Python 自带的,所以必须先安装。通过命令行,运行 pip install requests。编写 requests 模块是因为 Python 的 urllib2 模块用起来太复杂。实际上,请拿一支记号笔涂黑这一段。忘记我曾提到 urllib2。如果你需要从 Web 下载东西,使用requests 模块就好了。接下来,做一个简单的测试,确保 requests 模块已经正确安装。在交互式环境中输入以下代码:

>>> import requests

如果没有错误信息显示,requests 模块就已经安装成功了。

用 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 个字符。

检查错误

正如你看到的,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_statusraise 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()。你希望确保下载确实成功,然后再让程序继续。

将下载的文件保存到硬盘

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

python用 requests 模块从 Web 下载文件相关推荐

  1. 说说如何利用 Python 的 requests 模块,从网络下载电子小说

    利用 Python 的 requests 模块可以很容易从网络下载电子小说,甚至可以处理 https 连接!首先必须先安装该模块. 通过命令行,运行 -> pip install request ...

  2. python怎么爬取Linux作业,Python爬虫之使用Fiddler+Postman+Python的requests模块爬取各国国旗...

    介绍 本篇博客将会介绍一个Python爬虫,用来爬取各个国家的国旗,主要的目标是为了展示如何在Python的requests模块中使用POST方法来爬取网页内容. 为了知道POST方法所需要传递的HT ...

  3. Python爬虫之使用Fiddler+Postman+Python的requests模块爬取各国国旗

    介绍   本篇博客将会介绍一个Python爬虫,用来爬取各个国家的国旗,主要的目标是为了展示如何在Python的requests模块中使用POST方法来爬取网页内容.   为了知道POST方法所需要传 ...

  4. 关于python中requests模块导入问题-python中requests模块的使用方法

    本文实例讲述了python中requests模块的使用方法.分享给大家供大家参考.具体分析如下: 在HTTP相关处理中使用python是不必要的麻烦,这包括urllib2模块以巨大的复杂性代价获取综合 ...

  5. Windows从web下载文件的几种方式

    最近搞app自动化测试,需要自动从网页上下载apk用于测试,顺便学习了几种从web下载文件的方式. 一.PowerShell DownloadFile 命令 PowerShell 是一种winodws ...

  6. python的requests模块功能_python中requests模块的使用方法

    本文实例讲述了python中requests模块的使用方法.分享给大家供大家参考.具体分析如下: 在HTTP相关处理中使用python是不必要的麻烦,这包括urllib2模块以巨大的复杂性代价获取综合 ...

  7. Python爬虫---requests模块的基本使用

    Python爬虫-requests模块的基本使用 基础 什么是爬虫? 就是通过编写程序模拟浏览器上网,然后让其去互联网上爬取数据的过程. 爬虫的分类 通用爬虫 抓取互联网中的一整张页面数据 聚焦爬虫 ...

  8. python不同层级模块的导入和文件的读写

    python不同层级模块的导入和文件的读写(2-201812103) 1 python 在不同层级目录import 模块的方法 2 python中文件的读写 1 python 在不同层级目录impor ...

  9. python如何导入requests模块_浅谈python中requests模块导入的问题

    浅谈python中requests模块导入的问题 今天使用Pycharm来抓取网页图片时候,要导入requests模块,但是在pycharm中import requests 时候报错. 原因: pyt ...

最新文章

  1. 创建总账科目类型会计凭证
  2. 见识决定眼界,关注这些让你变得博学且有趣
  3. 【计蒜客 - 蓝桥训练】蒜厂年会(单调队列优化dp,循环数列的最大子段和)
  4. 互联网晚报 | 11月13日 星期六 | 腾讯、抖音商谈对等开放;荣耀电商平台粉丝破亿;碧桂园杨惠妍第九次成为中国女首富...
  5. 格灵深瞳发起 AI · 爱 算法 在线编程挑战赛
  6. 7,7显示选中的目标信息
  7. linux lnmp1.5.tar.gz,Linux 下lnmp
  8. mysql jsp servlet 中文乱码问题。
  9. 信息系统项目管理通关指南
  10. 光伏发电最大功率点跟踪 (mppt) matlab/simulink仿真程序 恒定电压法 扰动观察法(po) 电导增量法(inc)模糊控制法(fuzzy)多种方法
  11. 你的计算机无法启动一键还原,电脑一开机就进入dos之家的一键还原硬盘版,无法进入系统...
  12. linux系统开机grub命令修复方法,linux系统GRUB修复
  13. 【游戏开发实战】2D游戏摄像机镜头跟随,屏幕边缘限制镜头移动(使用Cinemachine组件)
  14. TMS320C6748的StarterSware软件包
  15. CentOS7 安装Mldonkey(电驴)步骤
  16. 一个简单的ASP登录页面
  17. 手游摇杆(二)八方向摇杆和移动范围限制
  18. 流媒体技术介绍(上)
  19. 三维建筑形式的生成 Graph Convolutional Network
  20. 爬虫系列-雪球网选股策略爬取程序1.0

热门文章

  1. NGINX配置以及优化
  2. Git:SSL错误导致失败的解决办法
  3. GNSS原理与应用(五)——GPS卫星信号
  4. 电信天翼云服务器性能,中国电信天翼云获可信云云主机“五星+”级别认证
  5. Ubuntu 8.04 优化设置
  6. Unity之JSON(数据存储)
  7. 透彻分析JAVA内存泄漏和内存溢出的区别
  8. 【CVPR 2021】pixelNeRF: Neural Radiance Fields from One or Few Images
  9. java 生成pdf文件,添加图片
  10. SQL语句一二三之SQL基本语句