如何使用 Python 调用小红书笔记评论 API 时进行并发控制?

我给你最简单、最实用、直接能运行 的并发控制方案,专门适配小红书 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请求...

三、并发控制最佳实践(直接照做)

  1. 每秒不超过 2 次请求
  2. 批量任务用 2 个线程以内
  3. 出现 429 错误立即停止 3~5 秒
  4. 不要使用多进程高并发
  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
相关推荐
自不量力的A同学2 小时前
MateClaw v1.0.418 发布
笔记
lsx2024062 小时前
PHP Error处理指南
开发语言
沐雪轻挽萤2 小时前
4. C++17新特性-内联变量 (Inline Variables)
开发语言·c++
树下水月2 小时前
使用python 一键生成,PGSQL的数据字典
python
高山流水&上善2 小时前
基于Qwen3-0.6B的光纤基础测试问答系统设计与实现
python·django
Chase_______2 小时前
【JAVA基础指南(四)】快速掌握类和对象 基础篇
android·java·开发语言
每天吃饭的羊2 小时前
Node.js 创建可二次编辑的 HTML 文档并生成文件
开发语言·javascript·ecmascript
疯狂成瘾者2 小时前
PromptTemplate类解读
python·langchain
Cat_Rocky2 小时前
创建LNMRP后端技术栈
java·开发语言