Python Requests 库使用指南
简介:Requests 是一个优雅而简单的 HTTP 库,专为人类设计。它让发送 HTTP/1.1 请求变得非常简单。
1. 安装与导入
# 安装 pip install requests # 导入 import requests
2. 基本请求方法
GET 请求
# 基本 GET 请求 response = requests.get('https://api.example.com/data') # 带参数的 GET 请求 params = {'key1': 'value1', 'key2': 'value2'} response = requests.get('https://api.example.com/data', params=params)
POST 请求
# 基本 POST 请求(表单数据) data = {'key1': 'value1', 'key2': 'value2'} response = requests.post('https://api.example.com/data', data=data) # JSON 格式的 POST 请求 json_data = {'key1': 'value1', 'key2': 'value2'} response = requests.post('https://api.example.com/data', json=json_data)
其他请求方法
requests.put('https://api.example.com/data', data=data) requests.delete('https://api.example.com/data') requests.patch('https://api.example.com/data', data=data) requests.head('https://api.example.com/data') requests.options('https://api.example.com/data')
3. POST 请求参数详解
| 参数 |
说明 |
Content-Type |
示例 |
data |
请求体数据(表单格式) |
application/x-www-form-urlencoded |
data={'key': 'value'} |
json |
JSON 格式数据 |
application/json |
json={'key': 'value'} |
params |
URL 查询参数 |
- |
params={'key': 'value'} |
files |
文件上传 |
multipart/form-data |
files={'file': open('file.txt')} |
headers |
自定义请求头 |
- |
headers={'Authorization': 'Bearer token'} |
cookies |
Cookies |
- |
cookies={'session': 'abc123'} |
auth |
认证信息 |
- |
auth=('user', 'pass') |
timeout |
超时时间(秒) |
- |
timeout=10 |
4. 重要概念对比
data vs json vs params 的区别
- data: 放在请求体中,格式为表单数据 (key=value&key2=value2)
- json: 放在请求体中,格式为 JSON ({"key": "value"})
- params: 附加在 URL 后面,无论 GET 还是 POST 都适用 (url?key=value)
# 示例对比 import requests # 1. 使用 data (表单格式) requests.post('https://api.com/login', data={'username': 'admin', 'password': '123456'}) # 请求体: username=admin&password=123456 # Content-Type: application/x-www-form-urlencoded # 2. 使用 json (JSON格式) requests.post('https://api.com/login', json={'username': 'admin', 'password': '123456'}) # 请求体: {"username": "admin", "password": "123456"} # Content-Type: application/json # 3. 使用 params (URL参数) requests.post('https://api.com/login', params={'token': 'xyz123'}) # URL: https://api.com/login?token=xyz123 # 请求体: 空 # 4. 混合使用 requests.post('https://api.com/login', params={'version': 'v1'}, # URL: ?version=v1 json={'username': 'admin'}) # Body: {"username": "admin"}
5. 响应处理
response = requests.get('https://api.example.com/data') # 状态码 print(response.status_code) # 200, 404, 500 等 # 响应内容 print(response.text) # 字符串格式 print(response.json()) # JSON 格式(自动解析) print(response.content) # 字节格式 # 响应头 print(response.headers) # 检查请求是否成功 if response.status_code == 200: data = response.json() print(data) else: print(f"请求失败: {response.status_code}")
6. 异常处理
import requests from requests.exceptions import Timeout, ConnectionError, HTTPError try: response = requests.get('https://api.example.com/data', timeout=10) response.raise_for_status() # 如果状态码表示错误,抛出异常 data = response.json() print(data) except Timeout: print("请求超时") except ConnectionError: print("连接错误") except HTTPError as e: print(f"HTTP 错误: {e}") except Exception as e: print(f"其他错误: {e}")
7. 实际应用场景
OAuth2.0 Token 交换
# 标准 OAuth2.0 实现(参数在请求体中) token_params = { 'grant_type': 'authorization_code', 'client_id': 'your_client_id', 'client_secret': 'your_client_secret', 'code': 'authorization_code', 'redirect_uri': 'https://yourapp.com/callback' } response = requests.post('https://oauth.server.com/token', data=token_params, timeout=10) if response.status_code == 200: token_data = response.json() access_token = token_data['access_token']
REST API 调用
# 创建资源 new_user = { 'username': 'john_doe', 'email': 'john@example.com', 'age': 30 } headers = { 'Authorization': 'Bearer your_access_token', 'Content-Type': 'application/json' } response = requests.post('https://api.example.com/users', json=new_user, headers=headers)
文件上传
# 上传文件 files = { 'file': ('report.pdf', open('report.pdf', 'rb'), 'application/pdf') } response = requests.post('https://api.example.com/upload', files=files)
8. 会话管理
# 使用 Session 保持连接和 Cookie session = requests.Session() # 登录 login_data = {'username': 'admin', 'password': '123456'} session.post('https://api.example.com/login', data=login_data) # 后续请求会自动携带 Cookie response = session.get('https://api.example.com/profile') # 关闭会话 session.close()
9. 高级用法
自定义请求头
headers = { 'User-Agent': 'MyApp/1.0', 'Accept': 'application/json', 'Authorization': 'Bearer token123' } response = requests.get('https://api.example.com/data', headers=headers)
代理设置
proxies = { 'http': 'http://proxy.example.com:8080', 'https': 'https://proxy.example.com:8080' } response = requests.get('https://api.example.com/data', proxies=proxies)
流式下载
# 大文件下载 response = requests.get('https://example.com/largefile.zip', stream=True) with open('largefile.zip', 'wb') as f: for chunk in response.iter_content(chunk_size=8192): f.write(chunk)
注意事项:
- 始终设置 timeout 参数,避免请求无限等待
- 生产环境中要妥善处理异常情况
- 敏感信息不要硬编码在代码中,使用环境变量或配置文件
- 对于频繁的请求,考虑使用 Session 来提高性能
10. 常见错误及解决方案
| 错误 |
原因 |
解决方案 |
| ConnectionError |
网络连接问题 |
检查网络、URL、防火墙设置 |
| Timeout |
请求超时 |
增加 timeout 值或检查服务器响应速度 |
| HTTPError 401 |
未授权 |
检查认证信息是否正确 |
| HTTPError 403 |
禁止访问 |
检查权限设置 |
| HTTPError 404 |
资源不存在 |
检查 URL 是否正确 |
| JSONDecodeError |
响应不是有效的 JSON |
先检查 response.text,确认响应格式 |