Python Requests库权威指南:HTTP请求的终极实践手册
·
Python Requests库权威指南:HTTP请求的终极实践手册
https://requests.readthedocs.io/en/latest/_static/requests-logo.png
一、Requests库核心价值
Requests是Python中最广泛使用的HTTP客户端库,其优势在于:
- ✅ 人类友好的API设计(比标准urllib库简洁90%)
- ✅ 支持HTTPS连接、连接池、会话保持
- ✅ 自动处理编码、表单数据、JSON转换
- ✅ 超时控制、重试机制、代理支持
- 🚀 下载量超过10亿次/月(PyPI官方数据)
二、安装与环境准备
# 安装requests库
pip install requests
# 验证安装
python -c "import requests; print(requests.__version__)"
# 输出: 2.32.0 (2024年最新稳定版)
三、HTTP四大核心请求方法
1. GET请求 - 获取资源
import requests
# 基本请求
response = requests.get('https://api.github.com')
print(f"状态码: {response.status_code}") # 200
print(f"响应头: {response.headers['Content-Type']}") # application/json
# 带参数请求
params = {'q': 'python', 'sort': 'stars'}
response = requests.get('https://api.github.com/search/repositories', params=params)
# 解析JSON响应
data = response.json()
print(f"找到仓库数: {data['total_count']}")
2. POST请求 - 提交数据
# 表单提交
payload = {'username': 'admin', 'password': 'secure'}
response = requests.post('https://httpbin.org/post', data=payload)
print(response.text)
# JSON提交
json_data = {'title': 'Requests指南', 'content': '...'}
response = requests.post('https://api.example.com/posts', json=json_data)
print(f"创建资源ID: {response.json()['id']}")
3. PUT/PATCH请求 - 更新资源
# PUT请求 - 完全替换资源
response = requests.put('https://api.example.com/users/1', json={'name': '新用户名'})
# PATCH请求 - 部分更新资源
response = requests.patch('https://api.example.com/users/1', json={'email': 'new@email.com'})
4. DELETE请求 - 删除资源
response = requests.delete('https://api.example.com/posts/123')
if response.status_code == 204:
print("删除成功")
四、高级请求处理技巧
1. 超时控制 - 防止阻塞
# 总超时设置
try:
response = requests.get('https://slow-api.com', timeout=3)
except requests.exceptions.Timeout:
print("请求超时")
# 分层超时设置 (连接时间+读取时间)
response = requests.get('https://example.com', timeout=(1.5, 5))
2. 自定义请求头
headers = {
'User-Agent': 'MyApp/1.0',
'Authorization': 'Bearer TOKEN',
'Accept-Language': 'zh-CN'
}
response = requests.get('https://api.example.com', headers=headers)
3. 文件上传与下载
# 文件上传
files = {'file': open('report.xlsx', 'rb')}
response = requests.post('https://api.example.com/upload', files=files)
# 大文件流式下载
response = requests.get('https://example.com/large-file.zip', stream=True)
with open('local_copy.zip', 'wb') as f:
for chunk in response.iter_content(chunk_size=8192):
f.write(chunk)
4. 会话保持 - Cookies共享
# 创建会话对象
session = requests.Session()
# 登录保存Cookie
login_data = {'user': 'admin', 'pass': 'secret'}
session.post('https://example.com/login', data=login_data)
# 后续请求自动携带Cookie
response = session.get('https://example.com/dashboard')
print(f"当前用户: {response.json()['username']}")
五、响应处理全解析
响应内容类型处理
| 内容类型 | 处理方法 | 示例 |
|---|---|---|
| JSON响应 | .json() |
response.json()['key'] |
| 文本内容 | .text |
response.text[:100] |
| 二进制数据 | .content |
open('img.jpg', 'wb').write(response.content) |
| 原始流 | .raw |
shutil.copyfileobj(response.raw, local_file) |
状态码智能检查
# 基础检查
if response.status_code == 200:
print("成功")
# 高级状态检查
response.raise_for_status() # 自动处理4xx/5xx错误
# 状态码常量 (推荐)
if response.status_code == requests.codes.ok:
print("成功")
if response.status_code == requests.codes.not_found:
print("资源不存在")
六、安全与企业级实践
1. HTTPS证书验证
# 启用验证 (默认)
requests.get('https://secure-api.com')
# 禁用验证 (仅限测试环境)
requests.get('https://self-signed.badssl.com', verify=False)
# 使用自定义CA包
requests.get('https://internal-api.com', verify='/path/to/cert.pem')
2. 代理配置
proxies = {
'http': 'http://10.10.1.10:3128',
'https': 'http://user:pass@10.10.1.10:3128',
}
requests.get('https://api.example.com', proxies=proxies)
3. 重试机制
from requests.adapters import HTTPAdapter
from urllib3.util.retry import Retry
# 创建带重试的会话
session = requests.Session()
retry = Retry(total=3, backoff_factor=0.5, status_forcelist=[500, 502, 503])
adapter = HTTPAdapter(max_retries=retry)
session.mount('http://', adapter)
session.mount('https://', adapter)
# 使用会话发出请求
response = session.get('https://unstable-api.com')
七、实战案例集合
案例1:调用天气API
API_KEY = "YOUR_API_KEY"
location = "Beijing"
def get_weather():
url = f"https://api.weatherapi.com/v1/current.json?key={API_KEY}&q={location}"
response = requests.get(url)
data = response.json()
return {
'temperature': data['current']['temp_c'],
'condition': data['current']['condition']['text']
}
weather = get_weather()
print(f"北京气温: {weather['temperature']}℃, 天气情况: {weather['condition']}")
案例2:网站内容抓取
import re
from bs4 import BeautifulSoup
response = requests.get('https://news.baidu.com')
soup = BeautifulSoup(response.text, 'html.parser')
# 提取所有新闻标题
titles = [h3.get_text() for h3 in soup.find_all('h3', class_='title')]
for title in titles[:5]:
print(title)
案例3:调用OAuth2.0接口
# OAuth2.0认证流程
auth_url = "https://oauth.example.com/authorize"
token_url = "https://oauth.example.com/token"
client_id = "YOUR_CLIENT_ID"
client_secret = "YOUR_SECRET"
# 获取访问令牌
auth_response = requests.post(
token_url,
data={
'grant_type': 'client_credentials',
'client_id': client_id,
'client_secret': client_secret
}
)
access_token = auth_response.json()['access_token']
# 使用令牌调用API
headers = {'Authorization': f'Bearer {access_token}'}
api_response = requests.get('https://api.example.com/data', headers=headers)
print(api_response.json())
八、最佳实践总结
-
API调用原则:
- 始终检查状态码(使用
raise_for_status()) - 设置合理的超时(默认添加
timeout=10) - 处理JSON解析异常
- 始终检查状态码(使用
-
性能优化:
# 重复请求使用会话 session = requests.Session() # 启用连接池 session.mount('https://', requests.adapters.HTTPAdapter(pool_connections=10)) # 重用连接 responses = [session.get(url) for url in url_list] -
安全建议:
- 敏感信息存储在环境变量
- 生产环境始终验证HTTPS证书
- 限制重试次数防止DoS
-
错误处理模式:
try: response = requests.get(url, timeout=10) response.raise_for_status() return response.json() except requests.exceptions.Timeout: return "请求超时" except requests.exceptions.HTTPError as err: return f"HTTP错误: {err.response.status_code}" except requests.exceptions.RequestException as err: return f"网络错误: {err}"
官方资源:requests·PyPI
进阶学习方向
- 深入Session对象实现原理
- 扩展自定义认证处理
- 整合异步请求(aiohttp)
- 监控请求指标(时间/重试次数)
通过本指南,您可以处理95%以上的HTTP请求场景,开始高效地开发Web应用、调用API或进行数据采集!
更多推荐


所有评论(0)