在 Python 开发中,发送 HTTP 请求是高频需求,无论是调用第三方 API、爬取网页数据,还是与后端服务交互,都需通过 HTTP 请求实现数据传输。Python 提供了多个库支持 HTTP 请求,其中urllib(标准库)和requests(第三方库)最为常用。小编将详解这两个库的使用方法,覆盖 GET/POST 核心请求、参数配置及异常处理,助你高效完成 HTTP 交互需求。
一、核心库选择:urllib vs requests
Python 发送 HTTP 请求的库主要分为两类,选择需结合场景需求:
urllib:Python 标准库(无需额外安装),包含urllib.request(请求发送)、urllib.parse(参数解析)等模块,兼容性强但语法较繁琐,适合无第三方库依赖的场景;
requests:第三方库(需pip install requests安装),API 设计简洁直观,支持会话保持、文件上传等高级功能,开发效率更高,是日常开发的首选。
二、基础 HTTP 请求实现:GET 与 POST
HTTP 请求中,GET 用于获取数据,POST 用于提交数据(如表单、JSON),以下分别用两个库实现核心场景。
(一)使用 requests 库:简洁高效
requests库通过requests.get()、requests.post()等方法直接发送请求,返回的Response对象包含响应数据、状态码等信息。
1. GET 请求:获取数据(如查询接口)
GET 请求的参数通常拼接在 URL 后,用params参数传入字典即可自动编码,无需手动处理 URL 拼接。
TypeScript取消自动换行复制
import requests
# 目标接口:查询天气(示例接口,需替换为有效API)
url = "https://api.example.com/weather"
# GET参数:城市、日期
params = {"city": "Beijing", "date": "20250901"}
# 发送GET请求,设置超时时间(避免无限等待)
response = requests.get(url, params=params, timeout=5)
# 处理响应
print("状态码:", response.status_code) # 200表示成功
print("响应文本:", response.text) # 字符串形式响应内容
print("JSON响应:", response.json()) # 若响应为JSON,直接解析为字典
2. POST 请求:提交数据(如表单 / JSON)
POST 请求数据需放在请求体中,根据接口要求选择 “表单格式” 或 “JSON 格式”:
表单格式:用data参数传入字典,请求头Content-Type自动设为application/x-www-form-urlencoded;
JSON 格式:用json参数传入字典,请求头自动设为application/json(推荐接口交互使用)。
TypeScript取消自动换行复制
# 1. 提交表单数据
form_data = {"username": "test", "password": "123456"}
response_form = requests.post(
"https://api.example.com/login",
data=form_data,
timeout=5
)
# 2. 提交JSON数据(更常用)
json_data = {"user_id": 1001, "action": "get_info"}
response_json = requests.post(
"https://api.example.com/user",
json=json_data,
timeout=5
)
print("JSON响应结果:", response_json.json())
(二)使用 urllib 库:标准库实现
urllib需手动处理参数编码、请求对象构建,步骤较繁琐,但无需依赖第三方库。
1. GET 请求:手动编码参数
TypeScript取消自动换行复制
from urllib import request, parse
url = "https://api.example.com/weather"
params = {"city": "Shanghai", "date": "20250901"}
# 1. 编码参数(转换为URL字符串格式)
encoded_params = parse.urlencode(params)
# 2. 拼接URL
full_url = f"{url}?{encoded_params}"
# 3. 发送请求
with request.urlopen(full_url, timeout=5) as response:
# 读取响应(字节流需解码为字符串)
response_text = response.read().decode("utf-8")
print("响应文本:", response_text)
2. POST 请求:构建请求对象
TypeScript取消自动换行复制
import json
url = "https://api.example.com/user"
json_data = {"user_id": 1002, "action": "get_info"}
# 1. 转换JSON数据为字节流
data_bytes = json.dumps(json_data).encode("utf-8")
# 2. 构建请求对象,设置请求头
req = request.Request(
url=url,
data=data_bytes,
headers={"Content-Type": "application/json"} # 手动设置JSON头
)
# 3. 发送请求
with request.urlopen(req, timeout=5) as response:
response_json = json.loads(response.read().decode("utf-8"))
print("JSON响应:", response_json)
三、进阶操作:headers、Cookie 与会话保持
实际开发中,需配置请求头(如 User-Agent)、携带 Cookie 或保持会话,确保请求符合接口要求。
(一)设置请求头:模拟浏览器 / 合法身份
部分接口会验证User-Agent(判断是否为浏览器请求)或Authorization(身份令牌),需在请求中添加 headers:
TypeScript取消自动换行复制
headers = {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) Chrome/120.0.0.0",
"Authorization": "Bearer your_token_here" # 接口认证令牌
}
response = requests.get(
"https://api.example.com/protected",
headers=headers,
timeout=5
)
(二)携带 Cookie:维持登录状态
若接口需登录后访问,可通过cookies参数携带 Cookie(字典格式):
TypeScript取消自动换行复制
cookies = {"session_id": "abc123xyz789", "user_name": "test"}
response = requests.get(
"https://api.example.com/user/info",
cookies=cookies,
timeout=5
)
(三)会话保持:复用连接与 Cookie
使用requests.Session()创建会话对象,可自动保存 Cookie、复用 TCP 连接,适合多请求交互(如登录后多次访问接口):
TypeScript取消自动换行复制
# 创建会话
session = requests.Session()
# 1. 登录(会话自动保存Cookie)
login_data = {"username": "test", "password": "123456"}
session.post("https://api.example.com/login", json=login_data, timeout=5)
# 2. 后续请求(自动携带登录Cookie)
response = session.get("https://api.example.com/user/orders", timeout=5)
print("用户订单:", response.json())
# 关闭会话
session.close()
四、异常处理:确保请求稳定性
网络波动、接口错误可能导致请求失败,需捕获requests.exceptions或urllib.error中的异常,避免程序崩溃:
TypeScript取消自动换行复制
import requests
from requests.exceptions import Timeout, ConnectionError, HTTPError
try:
response = requests.get("https://api.example.com/weather", timeout=5)
response.raise_for_status() # 若状态码≥400(如404、500),抛出HTTPError
print("请求成功:", response.json())
except Timeout:
print("请求超时:请检查网络或增加超时时间")
except ConnectionError:
print("连接失败:请检查URL或服务器状态")
except HTTPError as e:
print(f"接口错误:状态码{e.response.status_code},详情{e.response.text}")
except Exception as e:
print(f"未知错误:{str(e)}")
Python 发送 HTTP 请求的核心库中,requests以简洁的 API、丰富的功能成为首选,适合绝大多数开发场景;urllib作为标准库,适合无第三方依赖的环境。实际开发中,需根据请求类型(GET/POST)选择对应方法,配置 headers、Cookie 或会话保持以适配接口要求,同时通过异常处理确保请求稳定性。