如何使用 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
相关推荐
weixin_460443563 小时前
2026年新修订《网络安全法》实施:Java私有化考试系统如何做好SBOM、漏洞治理与安全升级?
java·开发语言·在线考试系统·企业培训考试系统·宏远培训考试系统·国企培训考试系统·国产化培训系统
kobe_OKOK_5 小时前
__getattr__和__getattribute__如何用
python
全栈弄潮儿6 小时前
Python实战第2期: 变量与数据类型
后端·python·agent
长沙三为智能科技6 小时前
家政小程序门店运营模块设计:会员、下单、派单、结算四段链路的落地拆解
python·小程序·内容运营
Cc.Y6 小时前
Java零基础入门:可变字符串与包装类:StringBuilder、StringBuffer 与 通讯录管理系统实战
java·开发语言·python
启观川6 小时前
数据结构与算法 -第 3 章 常用算法-动态规划
数据结构·笔记·python·算法
码爸6 小时前
排序算法介绍
python·算法·排序算法
阿森_dev6 小时前
2027 届毕设选题怎么选:30 个 Java 方向选题的实现难度排序
java·开发语言·spring boot·毕业设计·课程设计
by209996 小时前
C++ 多态:同一个基类接口,调用不同的函数
开发语言·c++·经验分享·多态
笔墨登场说说6 小时前
flink bin/start-cluster.sh 帮我做成开机启动
开发语言·python