随笔记录方便自己和同路人查阅。
#------------------------------------------------我是可耻的分割线-------------------------------------------
requests 模块让你很容易从 Web 下载文件,不必担心一些复杂的问题,诸如网络错误、连接问题和数据压缩。requests 模块不是 Python 自带的,所以必须先安装。
通过命令行,运行 pip install requests。
#------------------------------------------------我是可耻的分割线-------------------------------------------
1、检查requests模块是否安装成功,在交互式环境输入import requests,如果没有报错,就证明安装成功。
这样就证明是没有问题的。
2、用requests.get()函数下载一个网页,示例代码;
#! python 3 # -*- coding:utf-8 -*- # Autor: Li Rong Yang #导入第三方库 import requests #该 URL 指向一个文本页面,其中包含整部罗密欧与朱丽叶 res = requests.get('http://www.gutenberg.org/cache/epub/1112/pg1112.txt') #打印它的类型 print(type(res)) #通过检查 Response 对象的 status_code 属性,你可以了解对这个网页的请求是否成功。如果该值等于requests.codes.ok,那么一切都好 if res.status_code == requests.codes.ok: print('True') else: print('False') #打印大小 print(len(res.text)) #打印文本内容 print(res.text[:250])
运行结果:
requests.get()函数接受一个要下载的 URL 字符串。通过在 requests.get()的返回值上调用 type(),你可以看到它返回一个 Response 对象,其中包含了 Web 服务器对
你的请求做出的响应。
该 URL 指向一个文本页面,其中包含整部罗密欧与朱丽叶。通过检查 Response 对象的 status_code 属性,你可以了解对这个网页的请求是否成功。如果该值等于requests.codes.ok,那么一切都好(顺便说一下,HTTP协议中“OK”的状态码是 200。你可能已经熟悉404 状态码,它表示“没找到”)。如果请求成功,下载的页面就作为一个字符串,保存在 Response 对象的 text变量中。这个变量保存了包含整部戏剧的一个大字符串,调用 len(res.text)表明,它的长度超过 178000 个字符。最后,调用 print(res.text[:250])显示前 250 个字符。
3、检查错误
正如你看到的,Response 对象有一个 status_code 属性,可以检查它是否等于requests.codes.ok,了解下载是否成功。检查成功有一种简单的方法,就是在 Response
对象上调用 raise_for_status()方法。如果下载文件出错,这将抛出异常。如果下载成功,就什么也不做。
raise_for_status()方法,下载错误,示例代码:
#! python 3
# -*- coding:utf-8 -*-
# Autor: Li Rong Yang
import requests
res = requests.get('http://inventwithpython.com/page_ _that_ _does_ _not_ _exist')
res.raise_for_status()
运行结果:
raise_for_status()方法,下载正常,示例代码:
#! python 3 # -*- coding:utf-8 -*- # Autor: Li Rong Yang import requests res = requests.get('http://www.gutenberg.org/cache/epub/1112/pg1112.txt') res.raise_for_status()
运行结果:
raise_for_status()方法是一种很好的方式,确保程序在下载失败时停止。这是一件好事:你希望程序在发生未预期的错误时,马上停止。如果下载失败对程序来说
不够严重,可以用 try 和 except 语句将 raise_for_status()代码行包裹起来,处理这一错误,不让程序崩溃。
遇到下载错误是不停止工作,示例代码:
#! python 3 # -*- coding:utf-8 -*- # Autor: Li Rong Yang 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))
运行结果:
4、将下载文件保存在硬盘
现在,可以用标准的 open()函数和 write()方法,将 Web 页面保存到硬盘中的一个文件。但是,这里稍稍有一点不同。首先,必须用“写二进制”模式打开该文件,即向函数传入字符串'wb',作为 open()的第二参数。即使该页面是纯文本的(例如前面下载的罗密欧与朱丽叶的文本),你也需要写入二进制数据,而不是文本数据,目的是为了保存该文本中的“Unicode 编码”。
为了将 Web 页面写入到一个文件,可以使用 for 循环和 Response 对象的iter_content()方法。
示例代码:
#! python 3 # -*- coding:utf-8 -*- # Autor: Li Rong Yang import requests res = requests.get('http://www.gutenberg.org/cache/epub/1112/pg1112.txt') try: res.raise_for_status() except Exception as exc: print('there was a problem: %s' % (exc)) playFile = open('d:\RomeoAndJuliet.txt','wb') #iter_content方法,循环的每次迭代中 for chunk in res.iter_content(100000): #把每次迭代内容写入文件 playFile.write(chunk) playFile.close()
运行结果:会把下载内容写入指定文件