response 对象并不是 Python 的内置对象,而是特指在使用 HTTP 请求库(最常见的是 requests 库)向服务器发送请求后,服务器返回的那个响应对象,这个对象包含了服务器对请求的完整回答。

你可以把它想象成一封寄出的信收到的回信,这封回信(response 对象)不仅包含了你想要的内容(信纸上的文字),还包含了信封上的所有信息(发件人、收件人、邮戳、邮票等)。
response 对象的来源
当你使用 requests 库时,通常会这样做:
import requests # 1. 发送一个 GET 请求到指定的 URL url = 'https://www.example.com' response = requests.get(url) # response 就是我们说的响应对象 # 2. 现在可以通过 response 对象获取服务器的各种信息
response 对象的核心属性和方法
response 对象提供了丰富的属性和方法,让你可以方便地解析和使用服务器的响应,以下是其中最重要和最常用的几个:
| 属性/方法 | 描述 | 示例 |
|---|---|---|
response.status_code |
HTTP 状态码,表示请求的结果是否成功。 | 200 (成功), 404 (未找到), 500 (服务器错误) |
response.text |
以字符串形式返回响应体内容,会自动根据 headers 的 Content-Type 和 requests 推测的编码进行解码。 |
response.text |
response.content |
以字节形式返回响应体内容,这对于处理非文本内容(如图片、音频、PDF)非常重要,因为它不会进行解码。 | response.content |
response.json() |
如果响应体是有效的 JSON 格式,此方法会将其解析为 Python 的字典或列表,如果响应不是 JSON,会抛出 JSONDecodeError。 |
data = response.json() |
response.headers |
一个类字典的对象,包含了服务器响应的头部信息。 | response.headers['Content-Type'] |
response.url |
最终请求的 URL,如果发生了重定向,这个值会是重定向后的最终 URL。 | response.url |
response.history |
一个包含所有重定向请求的 response 对象的列表(如果发生了重定向)。 |
for r in response.history: print(r.url) |
response.encoding |
从 HTTP 头部中猜测的响应编码,你可以手动修改它来正确解码文本。 | response.encoding = 'utf-8' |
response.reason |
HTTP 状态码对应的文本原因短语。 | 'OK', 'Not Found' |
response.cookies |
一个 RequestsCookieJar 对象,包含了服务器返回的 cookies。 |
response.cookies.get('cookie_name') |
代码示例与实践
让我们通过几个例子来直观地理解这些属性。

示例 1:获取网页内容并检查状态码
import requests
try:
# 发送 GET 请求
response = requests.get('https://httpbin.org/get')
# 检查请求是否成功 (状态码为 200)
if response.status_code == 200:
print(f"请求成功!状态码: {response.status_code}")
print(f"响应头: {response.headers}")
print(f"响应内容类型: {response.headers['Content-Type']}")
# 获取并打印文本内容
print("\n--- 响应文本 (前 200 字符) ---")
print(response.text[:200])
else:
print(f"请求失败,状态码: {response.status_code}, 原因: {response.reason}")
except requests.exceptions.RequestException as e:
print(f"请求发生错误: {e}")
示例 2:处理 JSON 响应
很多现代 API 都会返回 JSON 格式的数据。response.json() 是处理这种情况的最佳方式。
import requests
import json # 虽然response.json()会自动处理,但也可以用json模块手动解析
# 一个返回 JSON 数据的 API 端点
url = 'https://httpbin.org/json'
try:
response = requests.get(url)
# 首先检查状态码
response.raise_for_status() # 如果状态码不是 2xx,会抛出 HTTPError 异常
# 使用 .json() 方法直接解析
data = response.json()
print("成功解析 JSON 数据:")
# 现在可以像操作普通 Python 字典一样操作 data
print(f"JSON 数据中的 'slideshow' 键: {data['slideshow']}")
print(f"JSON 数据中的 'author' 键: {data['slideshow']['author']}")
# 也可以手动解析 (不推荐,除非有特殊需求)
# data_manual = json.loads(response.text)
# print("\n手动解析的 JSON 数据中的 'author' 键:", data_manual['slideshow']['author'])
except requests.exceptions.HTTPError as errh:
print(f"HTTP 错误: {errh}")
except requests.exceptions.ConnectionError as errc:
print(f"连接错误: {errc}")
except requests.exceptions.Timeout as errt:
print(f"请求超时: {errt}")
except requests.exceptions.RequestException as err:
print(f"发生错误: {err}")
示例 3:下载二进制文件(如图片)
下载图片、PDF 等文件时,必须使用 response.content,并使用 wb (write binary) 模式写入文件。
import requests
# 图片的 URL
image_url = 'https://httpbin.org/image/png' # httpbin.org 提供一个示例图片
save_path = 'downloaded_image.png'
try:
print(f"正在从 {image_url} 下载图片...")
response = requests.get(image_url, stream=True) # 使用 stream=True 可以更高效地下载大文件
# 再次检查状态码
response.raise_for_status()
# 以二进制写入模式打开文件
with open(save_path, 'wb') as f:
# iter_content 会分块读取内容,节省内存
for chunk in response.iter_content(chunk_size=8192):
f.write(chunk)
print(f"图片已成功保存到 {save_path}")
except requests.exceptions.RequestException as e:
print(f"下载图片时发生错误: {e}")
response 对象的生命周期
一个 response 对象的生命周期非常简单:
- 创建:当你调用
requests.get(),requests.post(),requests.put()等方法时,requests库会发送网络请求,并创建一个Response对象来封装服务器的所有响应信息。 - 使用:你通过访问其属性(如
.status_code,.text)或调用其方法(如.json())来获取所需的信息。 - 销毁:当这个对象所在的代码块执行完毕,或者你不再需要它时,Python 的垃圾回收机制会自动回收它所占用的内存。
最佳实践:使用 with 语句(虽然 requests 的 response 对象本身不强制要求,但这是一个好习惯)或者确保在用完 response 后尽快关闭它,尤其是在处理流式数据或长时间运行的脚本时,可以释放资源,对于简单的脚本,通常不需要显式关闭。

response 对象是 requests 库与服务器交互的核心,它是一个信息丰富的容器,包含了 HTTP 响应的方方面面:
- 元数据:状态码、响应头、URL 等(通过
.status_code,.headers,.url获取)。 - 有效载荷:实际的数据内容,可以是文本、JSON、二进制数据等(通过
.text,.json(),.content获取)。
掌握如何使用 response 对象是进行 Python Web 开发、爬虫、API 调用等任务的基础,在访问响应内容之前,总是先检查 response.status_code,这是健壮代码的关键一步。
