返回博客

小红书 API 大规模采集最佳实践:限流、重试、分页与去重

Rnote API 团队 · · 90 次阅读 · English
小红书数据 最佳实践 限流分页

把小红书(RedNote / Xiaohongshu)数据采集从"能跑"做到"稳定规模化",关键在几个工程细节:限流、重试、分页、去重和成本控制。这篇总结一套可以直接照搬的最佳实践,配 Rnote API 使用。

1. 限流与并发

给请求设并发上限与节流,别一上来就打满。遇到 429(限流)时退避稍等再试,平稳的请求曲线比突发洪峰更稳定、更省心。

2. 重试与退避

只对网络错误与 5xx 做重试,用指数退避(1s、2s、4s…)。好消息是 Rnote API 仅成功请求(HTTP 2xx)扣费,失败重试不额外计费,所以你可以放心加重试逻辑。

3. 分页:不同端点游标不同

端点 翻页方式
search/notes page 递增
user/posted 用上一页返回的 cursor
note/comments 游标对象 cursor + index
topic/feed cursor_score + last_note_id + last_note_ct

翻页时务必把上一次响应里的游标字段原样带入下一次请求,保证连续性。

4. 去重

跨页、跨排序、跨任务都可能拿到重复数据。统一按 note_id / user_id 去重(用集合或数据库唯一索引),既省额度也保证数据干净。

5. 成本与额度控制

  • 仅成功请求扣费,失败不花钱。
  • 先用小批量验证采集逻辑与字段,再规模化放量。
  • 给任务设预算上限,避免脚本异常时跑飞。

一个稳健的分页采集骨架(Python)

import time, requests

API = "https://rnote.dev/api/v2/crawler"
H = {"X-API-Key": "YOUR_API_KEY"}

def get(path, params, retries=3):
    for i in range(retries):
        r = requests.get(f"{API}/{path}", params=params, headers=H, timeout=30)
        if r.status_code == 200:
            return r.json()
        if r.status_code == 429:
            time.sleep(2 ** i)          # 限流退避
        elif r.status_code >= 500:
            time.sleep(2 ** i)          # 服务端错误退避
        else:
            r.raise_for_status()        # 4xx 不重试
    raise RuntimeError("retries exhausted")

def search_all(keyword, max_pages=10):
    seen = set()
    for page in range(1, max_pages + 1):
        data = get("search/notes", {"keyword": keyword, "page": page})
        items = extract_items(data)     # 按响应结构取列表
        if not items:
            break
        for it in items:
            nid = it["note_id"]
            if nid not in seen:         # 去重
                seen.add(nid)
                yield it

开始使用

把这套实践套进你的采集任务,几乎不用改就能稳定跑量。免费注册获取 API Key,配合 Python / Go 教程上手,详见接口文档定价