Requests 是 Python 中最流行的 HTTP 客户端库,由 Kenneth Reitz 开发,以“人类友好”为设计理念,简化了发送 HTTP 请求、处理响应的流程。相比 Python 内置的 urllib 库,Requests 语法更简洁,自动处理编码、Cookie、会话等细节,是接口测试、爬虫、API 交互等场景的首选工具。
一、Requests 安装
Requests 是第三方库,需通过 pip 安装:
pip install requests
二、核心功能:发送 HTTP 请求
Requests 支持所有常见的 HTTP 方法(GET、POST、PUT、DELETE 等),核心是通过 requests.方法名() 发送请求,返回一个 Response 对象,包含服务器响应的所有信息。
1. GET 请求(获取资源)
GET 是最常用的 HTTP 方法,用于从服务器获取资源(如网页内容、API 数据)。
(1)基本 GET 请求
import requests
# 发送 GET 请求(目标 URL:httpbin.org 是一个用于测试 HTTP 请求的网站)
url = "https://httpbin.org/get"
response = requests.get(url)
# 查看响应内容
print("状态码:", response.status_code) # 200 表示成功(HTTP 状态码)
print("响应头:", response.headers["Content-Type"]) # 响应类型(如 application/json)
print("响应文本:", response.text) # 响应内容(字符串形式)
print("响应字节:", response.content) # 响应内容(字节形式,适合二进制数据如图片)
(2)带查询参数的 GET 请求
很多时候需要在 URL 后添加查询参数(如 ?key1=value1&key2=value2),Requests 可通过 params 参数自动拼接,无需手动处理 URL 编码。
import requests
url = "https://httpbin.org/get"
# 定义查询参数(字典形式)
params = {
"name": "python",
"version": "3.10",
"features": ["simple", "powerful"] # 列表会自动转为多个 key=value(features=simple&features=powerful)
}
# 发送带参数的 GET 请求(params 参数传入字典)
response = requests.get(url, params=params)
# 查看实际请求的 URL(自动拼接了参数)
print("请求的 URL:", response.url) # 输出:https://httpbin.org/get?name=python&version=3.10&features=simple&features=powerful
# 解析 JSON 响应(若响应是 JSON 格式,可用 response.json() 直接转为字典)
data = response.json()
print("JSON 响应中的 args:", data["args"]) # 输出查询参数
2. POST 请求(提交数据)
POST 用于向服务器提交数据(如表单提交、API 新增资源),数据放在请求体中(而非 URL 上),更适合传输敏感信息或大量数据。
(1)发送表单数据(application/x-www-form-urlencoded)
模拟 HTML 表单提交,数据格式为 key1=value1&key2=value2,用 data 参数传入字典。
import requests
url = "https://httpbin.org/post"
# 表单数据(字典形式)
form_data = {
"username": "test_user",
"password": "123456",
"hobby": ["reading", "coding"] # 列表会转为 hobby=reading&hobby=coding
}
# 发送 POST 请求(data 参数传入表单数据)
response = requests.post(url, data=form_data)
# 解析响应(httpbin.org/post 会返回请求的详细信息)
data = response.json()
print("服务器收到的表单数据:", data["form"])
(2)发送 JSON 数据(application/json)
现代 API 常用 JSON 格式传输数据,Requests 可通过 json 参数直接传入字典,自动序列化并设置 Content-Type: application/json。
import requests
url = "https://httpbin.org/post"
# JSON 数据(字典形式)
json_data = {
"user": {
"name": "张三",
"age": 25
},
"tags": ["student", "python"]
}
# 发送 JSON 格式的 POST 请求(json 参数传入字典)
response = requests.post(url, json=json_data)
data = response.json()
print("服务器收到的 JSON 数据:", data["json"])
3. 其他 HTTP 方法(PUT、DELETE 等)
Requests 支持 PUT(更新资源)、DELETE(删除资源)、HEAD(仅获取响应头)等方法,用法与 GET/POST 类似。
import requests
url = "https://httpbin.org/put"
# PUT 请求(更新资源)
response = requests.put(url, data={"key": "new_value"})
url = "https://httpbin.org/delete"
# DELETE 请求(删除资源)
response = requests.delete(url)
# HEAD 请求(仅获取响应头,无响应体)
response = requests.head("https://httpbin.org/get")
print("HEAD 响应头:", response.headers)
三、响应处理(Response 对象)
发送请求后返回的 Response 对象包含服务器响应的所有信息,核心属性和方法如下:
| 属性/方法 | 说明 |
|---|---|
status_code |
HTTP 状态码(如 200 成功、404 未找到、500 服务器错误)。 |
headers |
响应头(字典形式,键不区分大小写)。 |
text |
响应内容(字符串,自动根据 Content-Type 解码,如 UTF-8)。 |
content |
响应内容(字节流,适合二进制数据如图片、视频)。 |
json() |
解析 JSON 格式的响应内容,返回字典或列表(若响应非 JSON 会抛异常)。 |
cookies |
响应中的 Cookie(RequestsCookieJar 对象,类似字典)。 |
url |
实际请求的 URL(可能因重定向变化)。 |
history |
重定向历史(包含之前的 Response 对象列表)。 |
示例:处理 JSON 响应与状态码
response = requests.get("https://httpbin.org/get")
# 判断请求是否成功(200 表示成功)
if response.status_code == 200:
print("请求成功")
data = response.json() # 解析 JSON 数据
print("服务器 IP:", data["origin"]) # 输出客户端 IP
else:
print(f"请求失败,状态码:{response.status_code}")
四、高级功能
1. 自定义请求头(Headers)
模拟浏览器或特定客户端发送请求(如设置 User-Agent 避免被服务器识别为爬虫),通过 headers 参数传入字典。
import requests
url = "https://httpbin.org/headers"
# 自定义请求头
headers = {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) Chrome/114.0.0.0 Safari/537.36", # 模拟 Chrome 浏览器
"Accept-Language": "zh-CN,zh;q=0.9" # 语言偏好
}
response = requests.get(url, headers=headers)
data = response.json()
print("服务器收到的请求头:", data["headers"])
2. 会话保持(Session)
Session 对象用于在多个请求间保持会话状态(如 Cookie 共享),适合模拟登录后访问需要权限的页面(一次登录,后续请求自动携带 Cookie)。
import requests
# 创建会话对象(自动管理 Cookie)
session = requests.Session()
# 1. 第一步:登录(假设登录接口需要提交用户名密码)
login_url = "https://httpbin.org/post"
login_data = {"username": "admin", "password": "admin123"}
session.post(login_url, data=login_data) # 登录请求,Cookie 会保存在 session 中
# 2. 第二步:访问需要登录的页面(自动携带登录后的 Cookie)
profile_url = "https://httpbin.org/cookies"
response = session.get(profile_url)
print("当前会话的 Cookie:", response.json()["cookies"])
# 关闭会话(可选)
session.close()
3. 超时设置(避免无限等待)
网络请求可能因服务器无响应而无限阻塞,通过 timeout 参数设置超时时间(秒),超过时间会抛出 Timeout 异常。
import requests
from requests.exceptions import Timeout
url = "https://httpbin.org/delay/5" # 该接口会延迟 5 秒响应
try:
# 设置超时时间为 3 秒(连接超时 + 读取超时)
response = requests.get(url, timeout=3)
except Timeout:
print("请求超时!服务器未在 3 秒内响应")
4. 代理设置(突破 IP 限制)
通过代理服务器发送请求(如爬虫时避免本地 IP 被封禁),proxies 参数传入代理字典(区分 HTTP 和 HTTPS)。
import requests
url = "https://httpbin.org/ip" # 该接口返回客户端 IP
# 代理配置(格式:协议 -> 代理地址)
proxies = {
"http": "http://127.0.0.1:8080", # HTTP 代理
"https": "https://127.0.0.1:8080" # HTTPS 代理
}
# 使用代理发送请求
response = requests.get(url, proxies=proxies)
print("通过代理的 IP:", response.json()["origin"])
5. SSL 证书验证(默认开启)
Requests 默认验证 HTTPS 证书的有效性,若访问自签名证书的网站(如内部服务),可关闭验证(不推荐,有安全风险)。
# 关闭 SSL 验证(verify=False)
response = requests.get("https://自签名证书的网站", verify=False)
# 若需指定自定义 CA 证书,传入证书路径
# response = requests.get("https://网站", verify="/path/to/cert.pem")
6. 异常处理
网络请求可能出现各种错误(如连接失败、超时、HTTP 错误),需通过 try-except 捕获异常。
import requests
from requests.exceptions import (
ConnectionError, # 连接失败(如网络不通)
Timeout, # 超时
HTTPError, # HTTP 错误(如 404、500)
RequestException # 所有请求异常的基类
)
try:
response = requests.get("https://httpbin.org/get", timeout=3)
response.raise_for_status() # 若状态码为 4xx/5xx,抛出 HTTPError 异常
except ConnectionError:
print("连接失败,请检查网络")
except Timeout:
print("请求超时")
except HTTPError as e:
print(f"HTTP 错误:{e}")
except RequestException as e:
print(f"请求异常:{e}")
五、Requests 优势总结
- 简洁易用:一行代码发送请求,自动处理 URL 编码、Cookie、响应解码等细节,无需像
urllib那样手动处理。 - 功能全面:支持所有 HTTP 方法、文件上传、会话保持、代理、超时等高级功能。
- 人性化设计:
response.json()直接解析 JSON,raise_for_status()快速判断请求是否成功,异常类型清晰。 - 广泛兼容:支持 Python 3.7+,与主流框架(如 Flask、Django)和工具无缝集成。
总结
Requests 是 Python 处理 HTTP 请求的“瑞士军刀”,无论是简单的接口调用、复杂的会话管理,还是爬虫场景的代理与异常处理,都能轻松应对。其核心优势在于“让开发者专注于业务逻辑,而非 HTTP 协议细节”,是 Python 网络编程的必备库之一。
requests 模块是一个优秀的 Python HTTP 库,简化了发送 HTTP 请求的过程。它比 Python 标准库中的 urllib 更加简洁和易用。以下是使用 requests 模块的基础知识:
1.安装:首先确保你已经安装了 requests 模块。如果没有安装,可以使用 pip 进行安装:
pip install requests
2.发送 GET 请求:
import requests
response = requests.get('https://api.github.com')
print(response.status_code) # 打印响应状态码
print(response.text) # 打印响应内容
3.发送 POST 请求:
import requests
data = {'key': 'value'}
response = requests.post('https://httpbin.org/post', data=data)
print(response.json()) # 将响应内容解析为 JSON 格式
4.处理响应:
- `response.status_code`:HTTP 状态码。
- `response.text`:响应内容,以字符串形式返回。
- `response.json()`:如果响应是 JSON 格式,可以使用此方法将其解析为 Python 字典。
5.处理异常:
requests 模块也提供了异常处理机制,比如 requests.exceptions.RequestException 可以捕获所有请求产生的异常,如网络问题、超时等。
6.自定义请求头和参数:
import requests
headers = {'User-Agent': 'Mozilla/5.0'}
params = {'key1': 'value1', 'key2': 'value2'}
response = requests.get('https://httpbin.org/get', headers=headers, params=params)
print(response.json())
7.会话对象:
如果需要保持某些参数(如 Cookie、身份认证等)在多个请求之间持续有效,可以使用 Session 对象:
import requests
session = requests.Session()
session.auth = ('user', 'pass')
session.headers.update({'x-test': 'true'})
response = session.get('https://httpbin.org/headers')
print(response.json())
8.其他 HTTP 方法:
requests 模块支持多种 HTTP 方法,如 PUT、DELETE、PATCH 等,使用方式类似于 GET 和 POST。