Skip to content

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)

  1. 写一个异步脚本,并发请求 10 个网页,比同步快 5 倍以上。
  2. 给你的 API 加上限流,疯狂刷新网页,触发 429 Too Many Requests 错误。

Next Mission: L35. 结业路演 (Demo Day):是骡子是马拉出来溜溜

基于 Claude Code 构建