我给你最简单、最实用、直接能运行 的并发控制方案,专门适配小红书 API,防止限流 / 429 / 封号。
一、小红书 API 并发规则(必须知道)
- 官方限制:QPS ≤ 5(每秒最多 5 次请求)
- 安全阈值:1 秒 1 次最稳
- 并发超限:返回
429限流、封禁 IP、token 失效 - 并发控制核心:控制请求频率 + 队列排队 + 延时等待
二、最简单并发控制方案(直接复制)
方法 1:延时控制(最稳、新手首选)
每次请求强制等待 1 秒,永不触发限流
python
运行
import time
import requests
def get_comment(note_id, cursor=""):
url = f"https://api.xiaohongshu.com/v2/notes/{note_id}/comments"
headers = {"Authorization": "Bearer YOUR_TOKEN"}
params = {"cursor": cursor, "page_size": 20}
res = requests.get(url, headers=headers, params=params)
time.sleep(1) # 强制延时1s → 并发安全
return res.json()
方法 2:线程池并发(高级、速度快)
适合批量爬取多篇笔记评论
python
运行
from concurrent.futures import ThreadPoolExecutor
import time
import requests
# 全局控制:每秒最多允许2个请求(安全值)
RATE_LIMIT = 2
last_request_time = []
def safe_get(note_id, cursor=""):
# 并发控制核心
global last_request_time
while len(last_request_time) >= RATE_LIMIT:
now = time.time()
last_request_time = [t for t in last_request_time if now - t < 1]
if last_request_time:
time.sleep(0.2)
last_request_time.append(time.time())
# 正常请求
headers = {"Authorization": "Bearer YOUR_TOKEN"}
url = f"https://api.xiaohongshu.com/v2/notes/{note_id}/comments"
res = requests.get(url, headers=headers, params={"cursor": cursor, "page_size": 20})
return res.json()
# 多线程并发(最多2线程)
with ThreadPoolExecutor(max_workers=2) as executor:
executor.map(safe_get, ["笔记1", "笔记2", "笔记3"])
方法 3:令牌桶算法(企业级)
最标准的 API 并发控制(自动限速)
python
运行
import time
class TokenBucket:
def __init__(self, rate, capacity):
self.rate = rate # 每秒生成token数
self.capacity = capacity
self.tokens = capacity
self.last_time = time.time()
def take(self):
now = time.time()
add = (now - self.last_time) * self.rate
self.tokens = min(self.capacity, self.tokens + add)
self.last_time = now
while self.tokens < 1:
time.sleep(0.1)
now = time.time()
add = (now - self.last_time) * self.rate
self.tokens = min(self.capacity, self.tokens + add)
self.last_time = now
self.tokens -= 1
# 使用:每秒最多2个请求
bucket = TokenBucket(rate=2, capacity=2)
def api_call():
bucket.take() # 限流
# 发起API请求...
三、并发控制最佳实践(直接照做)
- 每秒不超过 2 次请求
- 批量任务用 2 个线程以内
- 出现 429 错误立即停止 3~5 秒
- 不要使用多进程高并发
- cursor 翻页必须串行,不能并发
四、429 限流自动重试代码(必备)
python
运行
def get_with_retry(note_id, cursor="", retry=3):
for i in range(retry):
res = safe_get(note_id, cursor)
if res.get("code") == 429:
print("触发限流,等待5秒...")
time.sleep(5)
continue
return res
return None