第 11 章 · requests 与 CSV 数据处理
本章目标:使用 requests 调用 REST API(如 https://api.example.com 教学端点);处理超时、状态码与 JSON 响应;用标准库 csv 读写表格数据;完成 shop-demo 商品导入导出与简易报表;了解 pandas 为选修扩展。
学时建议:4~5 小时(含 1.5 小时跟练)
前置:ch10 虚拟环境与 pip;ch09 json。
11.1 安装与第一个请求
# 在 py-learn 或项目 .venv 中
pip install requests
import requests
resp = requests.get("https://api.example.com/health", timeout=5)
print(resp.status_code)
print(resp.text)
| 参数 | 说明 |
|---|---|
timeout | 秒,避免无限等待 |
headers | 自定义请求头 |
params | 查询字符串 |
json= | POST JSON 体 |
11.2 GET 与查询参数
url = "https://api.example.com/books"
params = {"page": 1, "limit": 10, "q": "python"}
resp = requests.get(url, params=params, timeout=10)
resp.raise_for_status() # 4xx/5xx 抛 HTTPError
data = resp.json()
for item in data.get("items", []):
print(item["title"], item.get("price"))
| 状态码 | 含义 |
|---|---|
| 200 | 成功 |
| 201 | 已创建 |
| 400 | 客户端错误 |
| 401/403 | 未授权/禁止 |
| 404 | 未找到 |
| 500 | 服务器错误 |
try:
resp = requests.get(url, timeout=5)
resp.raise_for_status()
except requests.Timeout:
print("请求超时")
except requests.HTTPError as e:
print("HTTP 错误", e.response.status_code)
except requests.RequestException as e:
print("网络异常", e)
11.3 POST 与请求头
payload = {
"user": "user-demo",
"sku": "BK-001",
"qty": 2,
}
headers = {
"Content-Type": "application/json",
"Accept": "application/json",
# "Authorization": "Bearer <token>", # 真实项目从环境变量读取
}
resp = requests.post(
"https://api.example.com/cart/items",
json=payload,
headers=headers,
timeout=10,
)
切勿在教程代码中硬编码真实密钥;练习可用虚构 token 或本地 mock 服务。
11.4 Session 与连接复用
session = requests.Session()
session.headers.update({"User-Agent": "shop-demo/1.0"})
r1 = session.get("https://api.example.com/books")
r2 = session.get("https://api.example.com/categories")
多次请求同一主机时 Session 更高效,并可保持 Cookie。
11.5 本地 Mock(无公网时)
若无法访问外网,可用本地 JSON 文件模拟:
from pathlib import Path
import json
def mock_get_books():
path = Path("fixtures/books.json")
return json.loads(path.read_text(encoding="utf-8"))
fixtures/books.json:
{
"items": [
{"sku": "BK-001", "title": "Python 基础", "price": 59.9},
{"sku": "BK-002", "title": "Web 开发", "price": 79.0}
]
}
11.6 csv 模块读写
写入
import csv
from pathlib import Path
rows = [
["sku", "title", "price", "stock"],
["BK-001", "Python 基础", "59.9", "10"],
["BK-002", "Web 开发", "79.0", "5"],
]
path = Path("products.csv")
with open(path, "w", encoding="utf-8", newline="") as f:
writer = csv.writer(f)
writer.writerows(rows)