小红书笔记评论API调用实战:从一级评论到二级评论的完整获取方案
发布时间:2026/9/28 4:18:10来源:尧图网络
1. 小红书笔记评论 API 到底能拿到什么小红书笔记评论 API 是一类按笔记 ID 拉取评论区数据的接口核心能力是把一条笔记下面的一级评论、以及一级评论下面的二级评论也就是回复按分页方式取回来。它适合做舆情监控、内容选题分析、竞品评论区挖掘、达人合作效果复盘这类场景。如果你正在做数据采集、内容运营工具或者评论分析看板这条链路基本是绕不开的。实际调用时很多人第一次会卡在三个地方一是分页游标 cursor 到底怎么传二是二级评论藏在哪个字段里三是返回的 JSON 结构里 items 和 item 的层级关系容易看晕。这篇就围绕smallredbook.item_review这个接口把请求参数、分页逻辑、字段结构、二级评论抓取验证一步步拆开给你一份可以直接复制的配置骨架。先说清楚层级关系接口返回的顶层是items里面有一个item数组这个数组装的是一级评论。每条一级评论里会带一个add_feedback字段二级评论回复就挂在这里。所以「从一级评论到二级评论」的本质是先翻页拿全一级评论再逐条解析add_feedback。理解这一点后面的参数和代码就顺了。我试过用这套结构跑通一条笔记的完整评论链路下面把可复制的部分都给你。2. 调用前的准备TaoToken 接入与 Key 获取在写请求之前需要先有一个可用的调用入口和密钥。TaoToken 提供统一的 API 接入层官网是 https://taotoken.net/?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_content API 基址是 https://taotoken.net/api 。你需要在控制台创建一个调用 key 和对应的 secret这两个值在后续每个请求里都要带上。具体操作路径是进入控制台 https://taotoken.net/console?utm_sourcetaotoken_aicg_blog_endutm_contentconsoleutm_campaignrewrite 在 API Keys 页面 https://taotoken.net/api-keys?utm_sourcetaotoken_aicg_blog_endutm_contentapi-keysutm_campaignrewrite 新建一组凭证。创建完成后把 key 和 secret 复制到本地配置文件不要硬编码进提交到仓库的代码里。如果你还想先验证模型侧的能力可以顺手在模型对话页 https://taotoken.net/chat?utm_sourcetaotoken_aicg_blog_endutm_contentmodel-chatutm_campaignrewrite 试一下请求是否通。这里有个容易忽略的点key 必须以 GET 方式拼接在 URL 上不是放在请求头里。很多人习惯把 token 塞进 Authorization header结果一直报鉴权失败就是因为这个接口的鉴权设计是 query 参数形式。secret 同理作为公共参数一起拼在 URL 上。注意key 和 secret 属于敏感凭证建议放在环境变量或本地.env文件里通过代码读取避免直接写死在脚本中。准备好凭证后就可以进入参数配置环节了。3. 可复制的请求配置骨架这个接口的公共参数和请求参数需要分开理解。公共参数是所有接口通用的请求参数是针对评论接口的。下面用表格把关键参数列清楚方便你对照填写。参数名类型必须说明keyString是调用 key以 GET 方式拼在 URL 中secretString是调用密钥api_nameString是接口名称这里是smallredbook.item_reviewcacheString否是否使用缓存默认 yesresult_typeString否返回格式默认 json可选 jsonu 让中文直接可读langString否翻译语言默认 cnnum_iidString是笔记 IDcursorString否翻页参数第一页默认为空请求地址的拼接方式是https://taotoken.net/api加上api_name再把公共参数和请求参数以 query string 形式拼上去。下面是一个可直接复制的 Python 请求骨架把YOUR_KEY、YOUR_SECRET、YOUR_NOTE_ID替换成你自己的值即可。import requests import json API_BASE https://taotoken.net/api API_NAME smallredbook.item_review def fetch_comments(note_id, cursor): params { key: YOUR_KEY, secret: YOUR_SECRET, api_name: API_NAME, num_iid: note_id, cursor: cursor, result_type: jsonu, # 中文直接可读 cache: yes, lang: cn, } resp requests.get(API_BASE, paramsparams, timeout15) resp.raise_for_status() return resp.json() if __name__ __main__: data fetch_comments(670202b0000000002a032d2d) print(json.dumps(data, ensure_asciiFalse, indent2))这段代码做了三件事拼接公共参数、发起 GET 请求、把返回结果格式化输出。result_type设成jsonu是为了让返回内容里的中文直接可读否则默认 json 会把中文转成 unicode 转义调试时看着累。如果你更习惯用 curl 快速验证可以这样写curl -G https://taotoken.net/api \ --data-urlencode keyYOUR_KEY \ --data-urlencode secretYOUR_SECRET \ --data-urlencode api_namesmallredbook.item_review \ --data-urlencode num_iid670202b0000000002a032d2d \ --data-urlencode cursor \ --data-urlencode result_typejsonucurl 的-G会把--data-urlencode的内容转成 GET 查询参数这样就不用自己手动拼 URL 了也避免了特殊字符转义问题。4. 分页逻辑与二级评论抓取验证拿到第一页数据后最关键的是判断还有没有下一页以及怎么把二级评论取出来。返回结构里有两个字段决定翻页has_more和cursor。has_more为true时说明还有下一页此时把返回的cursor原样传给下一次请求的cursor参数就能拿到下一页。第一页的cursor传空字符串即可。下面是一个完整的翻页 二级评论解析脚本把一级评论和二级评论分别收集起来import requests import json import time API_BASE https://taotoken.net/api API_NAME smallredbook.item_review def fetch_page(note_id, cursor): params { key: YOUR_KEY, secret: YOUR_SECRET, api_name: API_NAME, num_iid: note_id, cursor: cursor, result_type: jsonu, } resp requests.get(API_BASE, paramsparams, timeout15) resp.raise_for_status() return resp.json() def crawl_all(note_id, max_pages20): cursor first_level [] second_level [] page 0 while page max_pages: data fetch_page(note_id, cursor) items data.get(items, {}) comments items.get(item, []) or [] for c in comments: first_level.append({ user: c.get(display_user_nick), content: c.get(rate_content), like: c.get(like_count), date: c.get(rate_date), }) # 二级评论挂在 add_feedback reply c.get(add_feedback) if reply: second_level.append({ parent_user: c.get(display_user_nick), reply_content: reply, }) has_more items.get(has_more) cursor items.get(cursor, ) page 1 print(f第 {page} 页一级评论 {len(comments)} 条has_more{has_more}) if str(has_more).lower() ! true: break time.sleep(0.5) # 控制频率避免请求过密 return first_level, second_level if __name__ __main__: l1, l2 crawl_all(670202b0000000002a032d2d) print(f一级评论共 {len(l1)} 条二级评论共 {len(l2)} 条) print(json.dumps(l2[:3], ensure_asciiFalse, indent2))跑通后你会看到类似这样的输出每页打印当前页的一级评论数量和has_more状态最后汇总一级、二级评论总数。二级评论的示例结构里parent_user是发一级评论的人reply_content是回复内容。这样你就完成了从一级评论到二级评论的完整获取。验证成功的标志有三个一是has_more能正确从true翻到false并停止二是cursor每次都在变化说明翻页生效三是add_feedback非空的评论能被正确提取到二级列表里。如果这三点都满足链路就通了。5. 本篇常见报错与排查实际跑的时候报错基本集中在几个固定位置。下面按现象、原因、解决方式列出来方便你对照。鉴权失败或返回 key 无效最常见的原因是 key 或 secret 没拼在 URL 上而是放进了请求头。这个接口要求以 GET 方式把 key 拼在 URL 里检查你的请求方式是不是 POST或者参数是不是写到了 header。另外确认 key 和 secret 没有多余空格。返回结果里中文是乱码或转义默认result_type是 json中文会以 unicode 转义形式返回。把result_type改成jsonu就能直接看到中文。如果你用的是 json 格式在代码里用json.loads解析后中文也会正常显示只是原始字符串看着别扭。翻页翻不动一直返回同一页检查cursor是不是原样传递了返回里的值。返回的cursor是一个 JSON 字符串里面包含cursor、index、pageArea等字段必须整体传回去不能只取其中一部分。另外第一页要传空字符串不要传null或省略。add_feedback一直是 null说明这条一级评论没有回复属于正常情况。二级评论不是每条都有只有被回复过的评论才会带add_feedback。如果你的目标是统计二级评论总量需要遍历所有一级评论再判断。请求频率过高被限流连续快速翻页容易触发限流。在每次请求之间加time.sleep(0.5)到1秒的间隔既能稳定跑完也不容易触发风控。如果数据量大建议把翻页结果落库支持断点续爬。num_iid传错导致空结果笔记 ID 必须是有效的小红书笔记 ID传错或传了用户 ID 都会返回空。确认你拿到的是一篇具体笔记的 ID而不是主页或话题 ID。排查时建议先用 curl 单次请求确认鉴权和参数没问题再上脚本跑翻页。这样能把问题范围缩小到「参数」还是「逻辑」上。6. 继续深入把评论链路接进你的项目跑通单条笔记的评论获取只是第一步。真正落地到项目里通常还要考虑批量笔记、增量更新、数据存储这几件事。批量笔记就是把多个num_iid放进队列逐个跑注意控制并发和频率增量更新可以记录每条笔记上次抓到的cursor或时间戳下次只拉新增部分数据存储建议把一级评论和二级评论分表用num_iid和user_id做关联方便后续做评论情感分析或热点追踪。如果你后续要做更复杂的编码任务比如把评论采集、清洗、分析串成自动化流程可以了解一下 Coding Plan https://taotoken.net/coding-plan?utm_sourcetaotoken_aicg_blog_endutm_contentcoding-planutm_campaignrewrite 它更适合长期跑 Agent 类任务。接入文档在 https://taotoken.net/doc?utm_sourcetaotoken_aicg_blog_endutm_contentdocutm_campaignrewrite 里面有完整的参数说明和示例遇到字段含义不确定时可以直接查。需要管理多组凭证或查看调用量回到 API Keys 页面 https://taotoken.net/api-keys?utm_sourcetaotoken_aicg_blog_endutm_contentapi-keysutm_campaignrewrite 操作就行。最后留一个实用技巧把result_type固定成jsonu把翻页间隔设成 0.5 秒把一级和二级评论分开存这三条能帮你避开大部分调试期的坑。评论数据拿到手之后真正的价值在于你怎么用它而不是采集本身。
网站建设高端定制企业官网