L34. 复杂场景应对:当系统变大时
Vibe Coding 宣言:小车随便开,大车要驾照。当你的用户从 1 个变成 1 万个,规则就变了。
0. 为什么这一课至关重要? (Why It Matters)
- 高并发 (High Concurrency):如果一秒钟有 1000 个人同时点你的网站,服务器会直接冒烟。
- 反爬虫对抗:如果你的爬虫被目标网站发现了,它会给你发假数据,甚至封你 IP。
- 限流 (Rate Limiting):如果有人恶意攻击你的 API,你的钱包会瞬间清空。
1. 目标 (Goal)
理解 异步编程 (Asyncio)、反爬虫策略 和 API 限流 的基本原理。
2. 核心概念/装备/指令 (The Core)
2.1 Asyncio (The Speed)
- 同步: 排队打饭。一个人打完了下一个人才能打。
- 异步: 叫号取餐。点完餐去玩手机,饭好了叫你。效率高得多。
async def,await.
2.2 Rate Limit (The Shield)
- Token Bucket (令牌桶): 每秒发 10 个令牌,没令牌了就不让访问。
- Redis: 用来存令牌数量。
3. 实战演练 (Action)
Step 1: 异步爬虫
把之前的 requests 换成 aiohttp。
python
import aiohttp
import asyncio
async def fetch(url):
async with aiohttp.ClientSession() as session:
async with session.get(url) as response:
return await response.text()
async def main():
urls = ["http://example.com" for _ in range(100)]
tasks = [fetch(url) for url in urls]
await asyncio.gather(*tasks) # 并发执行!Step 2: 简单限流
使用 fastapi-limiter 给你的 API 加上保护。
python
from fastapi_limiter.depends import RateLimiter
@app.get("/", dependencies=[Depends(RateLimiter(times=2, seconds=5))])
async def root():
return {"msg": "Hello World"}这意味着:每 5 秒最多访问 2 次。
4. 常见问题 (FAQ - Vibe Style)
Q: 什么时候用异步? A: IO 密集型任务。 比如爬虫、读写数据库、调 API。如果是 CPU 密集型(算圆周率),异步没用。
Q: 被封 IP 了怎么办? A: 换 IP。 买个代理池,每次请求换个 IP。这是钞能力。
Q: 怎么防刷? A: 加验证码。 虽然体验不好,但是最有效。
5. 验收标准 (Definition of Done)
- 写一个异步脚本,并发请求 10 个网页,比同步快 5 倍以上。
- 给你的 API 加上限流,疯狂刷新网页,触发 429 Too Many Requests 错误。
Next Mission: L35. 结业路演 (Demo Day):是骡子是马拉出来溜溜