在2026年5月,Reddit关闭了对.json端点的未认证访问——这个“在任何URL后添加.json”的技巧,曾经支撑了数十个脚本、仪表板和个人项目。2026年7月28日的检查:使用普通浏览器的User-Agent请求https://www.reddit.com/r/webscraping/top.json?t=week返回403 Forbidden。与此同时,Reddit的robots.txt仅包含两行重要内容:User-agent: *和Disallow: /——指向公共内容政策。
这改变了的不仅是“如何绕过”,而是现在如何构建Reddit数据收集管道。以下是2026年的工作方案:什么是真正可用的,哪些限制,哪里需要代理,哪里又无济于事。
到底发生了什么:简短时间线
- 2023年6月——Reddit推出了每1000次API调用收费$0.24的付费计划,针对高负载应用。结果:Apollo关闭(开发者估计访问成本约为每年2000万美元),大多数第三方客户端退出,Pushshift停止——这是一个公共的帖子和评论档案,支撑了半数的学术研究。
- 2026年5月——不再支持未认证的
.json。那些“只需调用URL”的工具停止工作;流量通过Cloudflare保护进行会话验证。 - 2025年10月至今——Reddit对Perplexity AI、Oxylabs UAB、AWMProxy和SerpApi提起诉讼(纽约南区,法官Engelmayer)。Reddit指控被告通过Google搜索结果工业化提取其内容并转售数据,引用DMCA的反绕过条款。提交了第一份修改后的诉状;截至2026年3月,案件处于驳回动议阶段。被告否认违规:Perplexity称这是试图关闭公共数据,SerpApi和Oxylabs则表示在法律框架内访问公共网络。
第三点的实际结论是:绕过官方API收集Reddit数据并不是技术风险,而是法律风险,商业项目的错误代价不是被封禁,而是诉讼。关于2026年法院如何解读从搜索结果中提取数据的更多信息,我们在关于Google和SerpApi案件的裁决的材料中进行了讨论。
官方数据API:2026年的实际限制
这是唯一不产生法律争议的途径。在设计之前需要了解的数字:
- 每分钟100个请求,用于OAuth客户端。窗口平均约为10分钟,因此短时间内的峰值是可以接受的。
- 每分钟10个请求,没有OAuth——这不足以做任何事情,除了调试。
- 限制是按应用程序密钥计算,而不是最终用户。在同一个令牌上五个流并不会提供五倍的容量——它们只是以五倍的速度消耗一个预算。
- 免费计划覆盖个人项目、机器人、管理工具和学术研究。没有资金计数器,只有频率上限。
- 商业使用需要合同和手动批准;费用为每1000次调用$0.24。根据行业平台的估计,商业合同的入门门槛大约在每年$12,000。
- 在API数据上训练机器学习模型是被Data API条款明确禁止的。训练许可证是单独的私人合同(媒体对Reddit与Google的交易估计约为每年6000万美元)。
必须始终解析的标题
Reddit在每个响应中返回三个标题:X-Ratelimit-Used、X-Ratelimit-Remaining和X-Ratelimit-Reset。这是关于您预算的唯一可靠来源——不是代码中的常量,也不是旧维基中的“每分钟60个请求”(它在2023年就已经过时了)。
User-Agent的要求
Reddit期待一个独特的描述性字符串,格式为platform:app_id:version (by /u/username)。通用和空的User-Agent会被严格限制频率——如果限制在预期之前结束,这是首先要检查的内容。
逐步指南:如何构建一个不会崩溃的管道
- 在Reddit设置中注册script-app并获取client_id/client_secret。对于只读负载,这是最简单的应用类型。
- 根据上述格式设置正确的User-Agent。不要从其他教程中复制字符串——
app_id和昵称必须是您的。 - 在每个响应中读取
X-Ratelimit-Remaining,而不仅仅是在错误时。当剩余请求降到约20个时,转为均匀的节奏:调用延迟 = 重置窗口前的秒数 ÷ 剩余请求。这样您可以将配额分散在窗口中,而不是撞墙。 - 正确处理429。第一次暂停取自
Retry-After标题。之后——指数退避加随机抖动:wait = 2^attempt + random()。抖动是必须的:没有它,多个客户端会同步重复请求,导致第二次级联故障。 - 缓存带有TTL的读取。重复请求同一列表是监控项目中消耗配额的最常见原因。
- 通过轮换令牌而不是流进行扩展。每个OAuth令牌都有独立的计数器;在不同帐户上使用多个应用程序并进行轮询分配(在Python中使用
itertools.cycle)可以线性增加带宽。重要的是:对于商业负载,这并不能替代与Reddit的合同——这是一种在公平限制内运作的方式,而不是绕过它们。 - 考虑绕过列表上限。Reddit在每个列表中最多返回约1000个元素(每页100个,游标
after)。通过标准端点无法访问更旧的内容。常规解决方案是不要“突破”上限,而是按时间切割样本,并进行多个狭窄请求,而不是一个宽泛请求。 - 对于历史数据,寻找索引,而不是API。在Pushshift关闭后,其位置被外部索引如PullPush(免费,但没有SLA)和商业搜索API所占据,后者有自己的索引和其他上限。对于学术工作,Reddit有单独的Reddit for Researchers计划。
潜在的陷阱,往往会被忽视
PRAW可以缓解流量,但无法拯救一切。内置的PRAW限流器会读取标题并自行设置暂停——这对于单线程脚本非常有效。当前状态可以通过reddit.auth.limits查看。在以下两种情况下会失效:在使用共享凭证的多线程中(实例无法看到彼此的消耗)以及在异步代码中,阻塞的time.sleep会挂起事件循环。
AI代理会悄无声息地消耗配额。代理的一个推理步骤很容易展开为10-15次工具调用。十个并行会话就是100-150个同时请求,也就是整分钟预算在几秒钟内被消耗。如果您在Reddit上构建代理,限流器需要在池级别,而不是单个调用。
没有退避的轮询。每隔“N秒”检查更新而没有指数暂停是导致429的第二大原因,仅次于通用令牌。
在哪里真正需要代理,在哪里不需要
坦白说:代理不会增加您官方API的限制。配额与应用程序密钥相关,而不是与出站IP相关,试图通过更改地址来“繁殖”它是无效的,并且违反了条款。代理在Reddit管道中真正解决的任务是其他:
- 地理访问和连通性。Reddit在一些国家不可用或部分受限,而企业网络将其视为社交网络进行限制。在所需地区的稳定出口节点是基础设施可用性的问题,而不是绕过限制。对于具有固定IP的服务器任务,通常只需数据中心代理即可。
- 区域性结果。Reddit会根据请求的地理位置返回部分内容和推荐;如果您分析特定国家的受众所看到的内容,则需要来自该国的出口。
- 基础设施分散。当多个独立服务(收集、监控提及、分析)在同一服务器上运行时,单一IP会成为所有集成的共同故障点。
- 处理自己的账户。对于管理、社区运营和合法的SMM活动,多个个人资料的“账户↔固定IP”组合是基本的卫生措施。在这里,住宅代理与sticky会话是合适的。
但代理无法做到的事情:无法合法化绕过合同的商业收集,无法解除1000个元素的列表上限,也无法取消Disallow: /在robots.txt中的条款。关于平台限制的整体工作方法,请参见关于API中的速率限制和代理的作用的分析。
结论
在2026年,Reddit彻底不再是“可以通过.json获取的开放数据集”。工作方案如下:官方OAuth访问 + 基于标题的公平限流器 + 按规则轮换令牌 + 外部索引用于历史数据。在这个方案中,代理负责可用性和地理位置,而不是绕过配额——这是它们提供可预测结果的唯一角色。
如果您的项目是商业性的,请提前规划与Reddit的合同预算:与Perplexity、Oxylabs和SerpApi的诉讼历史表明,该平台愿意在保护其数据上花费远超合法访问的成本。
