在 Python 开发中,发送 HTTP 请求是实现接口调用、数据爬取、服务交互的核心需求 —— 无论是调用第三方 API(如天气接口、支付接口),还是与后端服务通信,都需要通过 HTTP 协议传递数据。Python 内置的urllib库虽能实现基础请求,但语法繁琐;而第三方库requests以简洁的 API、完善的功能成为主流选择。本文将从 HTTP 请求基础入手,详解requests库的安装、常用方法及实战技巧,帮助你高效实现 HTTP 交互。
一、HTTP 请求基础:理解核心概念
在使用requests库前,需先明确 HTTP 请求的核心要素,确保后续操作符合协议规范:
请求方法:常见类型包括 GET(获取资源)、POST(提交资源)、PUT(更新资源)、delete(删除资源),不同方法对应不同的业务场景;
请求 URL:目标资源的地址(如https://api.example.com/weather);
请求头(Headers):包含客户端信息(如浏览器标识、数据格式),部分接口需通过请求头验证身份(如Authorization令牌);
请求参数:GET 请求的参数通常拼接在 URL 后(如?city=beijing&date=20250828),POST 请求的参数多放在请求体(Body)中,格式可分为表单(Form Data)、JSON 等;
响应:服务器返回的结果,包含状态码(如 200 表示成功、404 表示资源不存在)、响应头、响应体(业务数据,多为 JSON 或 HTML 格式)。
二、requests 库的安装与基础使用
requests是 Python 第三方库,需先安装才能使用,其核心优势是 “语法简洁、功能全面”,支持所有 HTTP 请求方法,且自动处理 Cookie、会话保持等细节。
(一)安装 requests 库
通过 Python 包管理工具pip安装,命令如下(适用于 Windows、Linux、Mac):
TypeScript取消自动换行复制
pip install requests
安装完成后,在 Python 脚本中导入库即可使用:
TypeScript取消自动换行复制
import requests
(二)基础请求流程
使用requests发送 HTTP 请求的通用流程为:
构造请求参数(URL、方法、 headers、参数等);
调用requests对应的方法发送请求;
解析响应结果(状态码、响应体等)。
示例:发送最简单的 GET 请求,获取百度首页内容
TypeScript取消自动换行复制
import requests
# 1. 发送GET请求
response = requests.get("https://www.baidu.com")
# 2. 解析响应
print("状态码:", response.status_code) # 输出:200(表示请求成功)
print("响应体前100字符:", response.text[:100]) # 输出HTML内容片段
三、requests 库常用方法及实战示例
requests库为不同 HTTP 请求方法提供了对应的函数,核心常用方法包括get()、post()、put()、delete(),其中get()和post()覆盖 80% 以上的业务场景。
(一)GET 请求:获取资源(requests.get())
GET 请求用于从服务器获取资源,参数通常通过 URL 传递,适用于查询数据(如获取天气、查询用户信息)。
1. 基础用法:带 URL 参数的 GET 请求
若需传递参数(如查询 “北京” 的天气),可通过params参数传入字典,requests会自动将参数拼接为 URL 查询字符串(?city=北京&key=xxx)。
示例:调用模拟天气 API 获取北京天气
TypeScript取消自动换行复制
import requests
# 1. 配置请求参数
url = "https://api.example.com/weather" # 目标API地址
params = {
"city": "北京", # 查询的城市
"key": "abc123" # API密钥(通常由接口提供方分配)
}
# 2. 发送GET请求
response = requests.get(url, params=params)
# 3. 解析响应(假设响应体为JSON格式)
if response.status_code == 200: # 200表示请求成功
weather_data = response.json() # 将JSON响应体转为Python字典
print("城市:", weather_data["city"])
print("温度:", weather_data["temp"])
print("天气:", weather_data["desc"])
else:
print(f"请求失败,状态码:{response.status_code}")
2. 进阶用法:自定义请求头
部分 API 要求在请求头中携带客户端信息(如User-Agent模拟浏览器,Authorization传递令牌),可通过headers参数配置。
示例:带自定义 headers 的 GET 请求
TypeScript取消自动换行复制
import requests
url = "https://api.example.com/user/123" # 查询ID为123的用户信息
headers = {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) Chrome/120.0.0.0", # 模拟Chrome浏览器
"Authorization": "Bearer abcdef123456" # 身份令牌(JWT格式)
}
response = requests.get(url, headers=headers)
if response.status_code == 200:
print("用户信息:", response.json())
(二)POST 请求:提交资源(requests.post())
POST 请求用于向服务器提交数据(如提交表单、创建用户、上传文件),参数通常放在请求体中,安全性高于 GET(参数不暴露在 URL 中)。requests.post()支持多种请求体格式,最常用的是 “表单数据” 和 “JSON 数据”。
1. 提交表单数据(Form Data)
适用于模拟 HTML 表单提交(如登录、注册),需将参数通过data参数传入字典,requests会自动设置请求头Content-Type: application/x-www-form-urlencoded。
示例:模拟用户登录(提交用户名和密码)
TypeScript取消自动换行复制
import requests
url = "https://api.example.com/login" # 登录接口地址
data = {
"username": "test_user",
"password": "123456"
}
# 发送POST请求,提交表单数据
response = requests.post(url, data=data)
if response.status_code == 200:
result = response.json()
print("登录结果:", result["message"])
print("登录令牌:", result["token"]) # 登录成功后获取的身份令牌,后续请求需携带
else:
print("登录失败:", response.text)
2. 提交 JSON 数据(JSON Payload)
适用于前后端分离项目的 API 交互(如创建订单、更新用户信息),需将参数通过json参数传入字典,requests会自动设置请求头Content-Type: application/json,并将字典转为 JSON 字符串。
示例:创建新用户(提交 JSON 格式数据)
TypeScript取消自动换行复制
import requests
url = "https://api.example.com/users" # 创建用户的接口
headers = {
"Authorization": "Bearer abcdef123456" # 需携带登录后的令牌
}
user_data = {
"name": "张三",
"age": 25,
"email": "zhangsan@example.com"
}
# 发送POST请求,提交JSON数据
response = requests.post(url, headers=headers, json=user_data)
if response.status_code == 201: # 201表示资源创建成功
new_user = response.json()
print("新用户ID:", new_user["id"])
print("创建时间:", new_user["create_time"])
3. 上传文件(Multipart/Form-Data)
若需上传文件(如图片、文档),需通过files参数传入字典,requests会自动设置请求头Content-Type: multipart/form-data,适用于头像上传、文件提交等场景。
示例:上传图片文件
TypeScript取消自动换行复制
import requests
url = "https://api.example.com/upload" # 文件上传接口
headers = {
"Authorization": "Bearer abcdef123456"
}
files = {
# "file"为接口要求的参数名,open()打开文件,指定文件类型(image/jpeg)
"file": ("test.jpg", open("test.jpg", "rb"), "image/jpeg")
}
# 发送POST请求,上传文件
response = requests.post(url, headers=headers, files=files)
if response.status_code == 200:
upload_result = response.json()
print("文件URL:", upload_result["file_url"]) # 上传后文件的访问地址
(三)其他常用方法:PUT、delete
除 GET 和 POST 外,requests还支持 PUT(更新资源)、delete(删除资源)等方法,用法与 GET/POST 类似,仅需调用对应的函数并传递参数。
1. PUT 请求:更新资源(requests.put())
适用于全量更新资源(如修改用户的所有信息),参数传递方式与 POST 类似(支持data或json)。
示例:更新用户信息(全量更新)
TypeScript取消自动换行复制
import requests
url = "https://api.example.com/users/123" # 要更新的用户ID为123
headers = {
"Authorization": "Bearer abcdef123456"
}
update_data = {
"name": "张三_更新",
"age": 26,
"email": "zhangsan_update@example.com"
}
# 发送PUT请求,更新用户信息
response = requests.put(url, headers=headers, json=update_data)
if response.status_code == 200:
print("更新结果:", response.json()["message"]) # 输出:"用户信息更新成功"
2. delete 请求:删除资源(requests.delete())
适用于删除资源(如删除用户、删除订单),通常仅需传递 URL 和必要的请求头(如身份令牌)。
示例:删除用户(ID 为 123)
TypeScript取消自动换行复制
import requests
url = "https://api.example.com/users/123" # 要删除的用户ID为123
headers = {
"Authorization": "Bearer abcdef123456"
}
# 发送delete请求,删除用户
response = requests.delete(url, headers=headers)
if response.status_code == 204: # 204表示资源删除成功,无响应体
print("用户删除成功")
else:
print("删除失败:", response.text)
四、requests 库的进阶技巧
在实际开发中,还需处理超时控制、会话保持、异常捕获等场景,requests提供了对应的功能满足需求。
(一)设置请求超时
为避免请求因网络问题长期阻塞,可通过timeout参数设置超时时间(单位:秒),超时后会抛出requests.exceptions.Timeout异常。
示例:设置 5 秒超时
TypeScript取消自动换行复制
import requests
try:
response = requests.get("https://api.example.com/weather", params={"city": "北京"}, timeout=5)
print("请求成功")
except requests.exceptions.Timeout:
print("请求超时,需检查网络或接口状态")
(二)会话保持(Session)
若需多次请求同一域名(如登录后多次调用接口),使用requests.Session()可保持会话状态(自动保存 Cookie),避免每次请求都重新验证身份,提升效率。
示例:使用 Session 保持登录状态
TypeScript取消自动换行复制
import requests
# 创建Session对象
session = requests.Session()
# 1. 第一步:登录(Session会自动保存Cookie)
login_url = "https://api.example.com/login"
session.post(login_url, data={"username": "test_user", "password": "123456"})
# 2. 第二步:调用需要登录的接口(无需再次传递密码,Session自动携带Cookie)
user_info_url = "https://api.example.com/user/info"
response = session.get(user_info_url)
print("用户信息:", response.json())
# 3. 第三步:关闭Session
session.close()
(三)异常捕获
HTTP 请求可能因网络错误、接口错误等抛出异常,需通过try-except捕获常见异常(如Timeout、ConnectionError、HTTPError),确保程序稳定运行。
示例:完整的异常捕获
TypeScript取消自动换行复制
import requests
from requests.exceptions import Timeout, ConnectionError, HTTPError
try:
response = requests.get("https://api.example.com/weather", params={"city": "北京"}, timeout=5)
response.raise_for_status() # 若状态码非200(如404、500),抛出HTTPError异常
print("天气数据:", response.json())
except Timeout:
print("请求超时")
except ConnectionError:
print("网络连接错误(如域名不存在、服务器不可达)")
except HTTPError as e:
print(f"接口返回错误,状态码:{e.response.status_code}")
except Exception as e:
print(f"其他未知错误:{str(e)}")
掌握requests库的使用,能让你轻松实现 Python 与 HTTP 服务的交互,无论是对接第三方 API、开发前后端分离项目,还是实现数据爬取,都能高效完成需求,是 Python 开发的必备技能之一。