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())

八、最佳实践总结

  1. API调用原则

    • 始终检查状态码(使用raise_for_status()
    • 设置合理的超时(默认添加timeout=10
    • 处理JSON解析异常
  2. 性能优化

    # 重复请求使用会话
    session = requests.Session()
    
    # 启用连接池
    session.mount('https://', requests.adapters.HTTPAdapter(pool_connections=10))
    
    # 重用连接
    responses = [session.get(url) for url in url_list]
    
  3. 安全建议

    • 敏感信息存储在环境变量
    • 生产环境始终验证HTTPS证书
    • 限制重试次数防止DoS
  4. 错误处理模式

    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或进行数据采集!

Logo

Agent 垂直技术社区,欢迎活跃、内容共建。

更多推荐