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,确认响应格式

环境监测

PM2.5/10、温湿度、有害气体等实时监测