Skip to content

Requests - 概览

Requests 是一个优雅且简单的 Python HTTP 库,以其“为人服务的 HTTP”(HTTP for Humans)著称。它让您能以令人难以置信的便捷方式发送 HTTP/1.1 请求,抽象掉了在 Python 中进行 Web 请求通常会遇到的复杂性。对于大多数需要与 Web 服务和 API 交互的 Python 开发者来说,它是一个事实上的标准。

Requests 的官方文档是一个非常出色的资源,可以在这里找到:https://requests.readthedocs.io/en/latest/

虽然 Python 的标准库包含了诸如 urllib.request 等模块用于处理 HTTP,但 Requests 提供了明显更直观且用户友好的 API。主要优点包括:

  • 支持所有常用 HTTP 方法(GET、POST、PUT、DELETE、HEAD、OPTIONS)的简洁语法。
  • 自动内容解码(例如,从 UTF-8)和解压缩(例如,gzip)。
  • 默认提供类似浏览器的 SSL 验证(HTTPS)。
  • 带有 cookie 持久性和连接池的会话(Session)管理。
  • 轻松处理各种身份验证机制。
  • 轻松实现文件上传和 multipart 请求。
  • 支持国际化域名和 URL。

使用 Python 的包管理器 pip 安装 Requests 非常简单。强烈建议为您的项目使用虚拟环境(virtual environment)来干净地管理依赖。

pip install requests

安装完成后,您可以在 Python 脚本中导入它:import requests。

Requests 提供了一套丰富的功能集,可以无缝处理大多数 HTTP 通信需求:

通过简单的函数(例如,requests.get()、requests.post())支持所有标准 HTTP 方法(GET、POST、PUT、DELETE、HEAD、OPTIONS)。您可以轻松传递 URL 参数、自定义头部(headers)和请求体(request bodies)。

Response 对象提供了便捷的访问方式:.status_code(状态码)、.headers(头部)、.content(原始字节内容)、.text(解码后的字符串)和 .json()(用于解析 JSON 响应)。

通过将字典传递给 headers 参数来发送自定义 HTTP 头部。

在 GET 请求中,将 URL 参数(例如,?key=value)作为字典传递给 params 参数。

使用 data 参数发送表单编码数据。对于 JSON 载荷,json 参数会自动序列化 Python 字典并设置正确的 Content-Type 头部。

自动处理从服务器接收的 cookies,并允许您发送自定义 cookies。

requests.Session() 对象可在多个请求中保持参数(如 cookies、身份验证和头部)。它们还利用 urllib3 的连接池(connection pooling),提高了对同一主机重复请求的性能。

默认验证 HTTPS 请求的 SSL 证书,这对于安全通信至关重要。提供自定义 CA bundle 的选项。

内置支持常见的身份验证方案,如 HTTP Basic Auth 和 Digest Auth,并允许使用自定义身份验证处理器。

对于健壮的应用程序至关重要,可以为请求指定超时时间,以防止服务器无响应时发生无限期阻塞。

为网络问题或超时提供清晰的异常。response.raise_for_status() 方法可用于在 HTTP 响应状态码不佳(4xx 或 5xx)时引发 HTTPError 异常。重定向处理是自动的,但可配置。

这里是 Requests 实际应用的一个片段,用于从公共 API 获取数据:

import requests
URL = 'https://api.github.com/events'
try:
# Make a GET request - 发送一个 GET 请求
response = requests.get(URL, timeout=5) # Added a timeout - 添加了超时设置
# Check if the request was successful (status code 200-299)
# 检查请求是否成功(状态码 200-299)
response.raise_for_status() # Raises an HTTPError for bad responses - 对于错误响应抛出 HTTPError 异常
print(f"Status Code: {response.status_code}") # 状态码:
print(f"Content-Type: {response.headers.get('Content-Type')}") # Content-Type:
# Get the JSON response (list of events)
# 获取 JSON 响应(事件列表)
events = response.json()
print(f"Number of events received: {len(events)}") # 收到的事件数量:
if events:
print(f"Type of the first event: {events[0]['type']}") # 第一个事件的类型:
except requests.exceptions.HTTPError as http_err:
print(f'HTTP error occurred: {http_err} - Status: {http_err.response.status_code}') # 发生 HTTP 错误:{http_err} - 状态码:{http_err.response.status_code}
except requests.exceptions.ConnectionError as conn_err:
print(f'Connection error occurred: {conn_err}') # 发生连接错误:{conn_err}
except requests.exceptions.Timeout as timeout_err:
print(f'Timeout error occurred: {timeout_err}') # 发生超时错误:{timeout_err}
except requests.exceptions.RequestException as err:
print(f'An unexpected error occurred: {err}') # 发生一个意外错误:{err}
Status Code: 200
Content-Type: application/json; charset=utf-8
Number of events received: 30
Type of the first event: PushEvent
(Note: Actual event type and count may vary) # (注意:实际的事件类型和数量可能会有所不同)

本教程将深入探讨这些功能,使您能够有效地使用 Requests 库来完成 Python 项目中的各种 Web 交互任务。