如何使用 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
相关推荐
是上好佳佳佳呀19 分钟前
【机器学习|DAY03】K近邻算法(KNN)笔记
笔记·机器学习·近邻算法
-银雾鸢尾-4 小时前
C#中的拓展方法
开发语言·c#
guodingdingh6 小时前
软件开发工作问题总结0718
java·开发语言·数据库
优橙教育8 小时前
5G网优培训 vs Java开发:转行选哪个?
java·开发语言·5g
想会飞的蒲公英9 小时前
计算机怎样读取中文文本:编码、清洗与标准化
人工智能·python·自然语言处理
SeaTunnel10 小时前
从 Python Script 地狱到标准化数据集成框架
大数据·开发语言·python·程序员·代码·seatunnel
深度研习笔记10 小时前
OpenCV工业视觉实战09|项目EXE打包+工控机无环境部署+后台常驻运行,彻底脱离Python环境,完成项目最终交付
python·opencv·webpack
碎光拾影10 小时前
ARM交叉工具链各工具作用及IMX6ULL平台LED+蜂鸣器裸机程序实现
java·开发语言·数据库
圣光SG10 小时前
Servlet学习笔记
笔记·学习·servlet
CCPC不拿奖不改名10 小时前
大模型推理架构与开源生态知识整理
数据库·windows·python·架构·langchain·开源·github