2026年如何抓取Reddit数据:JSON端点和1,000限制

自从Reddit的API变为付费后,这个金矿变得更难接触——但公共.json端点仍然有效。以下是如何分页、突破1,000项限制,并在不被速率限制的情况下大规模收集数据的方法。

Reddit是互联网上最丰富的意见数据集之一——真实的人们在可搜索的社区中争论产品、工具、品牌和新闻。自从Reddit在2023年将其官方API改为付费定价(广泛报道为每1,000次调用$0.24,导致像Apollo这样的第三方应用关闭)以来,大规模收集这些数据变得更加棘手。但有一个途径没有被定价变化关闭:支持每个Reddit页面的公共.json端点。本指南涵盖如何分页、如何突破1,000项限制,以及如何在不触发速率限制的情况下收集数据。

在任何Reddit URL后附加.json

几乎每个Reddit URL在添加.json后都会返回结构化的JSON。不需要OAuth,不需要客户端密钥——只需一个HTTP GET。子版块列表、带评论树的帖子、用户历史:所有这些。请从这里开始:

import requests

headers = {"User-Agent": "research-script/1.0 by u/yourname"}
proxies = {"http": "http://USER:PASS@gate.quantumproxies.io:8000",
           "https": "http://USER:PASS@gate.quantumproxies.io:8000"}

url = "https://www.reddit.com/r/webscraping/new.json?limit=100"
r = requests.get(url, headers=headers, proxies=proxies, timeout=20)
data = r.json()

for child in data["data"]["children"]:
    post = child["data"]
    print(post["title"], post["ups"], post["num_comments"])

设置一个描述性的User-Agent——Reddit对通用的User-Agent更严格。JSON直接提供标题、分数(ups)、赞成率、评论数、作者和时间戳,因此无需从HTML中解析。

使用after令牌进行分页

列表页面使用光标而不是页码。每个响应都包含一个after令牌(最后一项的全名,如t3_abc123);将其传回以获取下一批。循环直到after返回null:

def fetch_listing(subreddit, sort="new", pages=10):
    after, out = None, []
    for _ in range(pages):
        url = f"https://www.reddit.com/r/{subreddit}/{sort}.json?limit=100"
        if after:
            url += f"&after={after}"
        data = requests.get(url, headers=headers, proxies=proxies, timeout=20).json()
        out += [c["data"] for c in data["data"]["children"]]
        after = data["data"].get("after")
        if not after:
            break
    return out
抓取Reddit的关键数字:1,000项列表限制,每1,000次API调用$0.24,.json端点,以及结合四种排序方式
1,000项限制是每种排序方式的——结合排序和时间过滤器是突破它的方法。

1,000项限制(以及如何突破它)

这是一个让人惊讶的限制:任何Reddit列表大约在1,000项时停止。分页一个子版块的new提要,大约在1,000个帖子后after令牌就会耗尽,无论还有多少帖子。这是一个平台范围的行为,而不是抓取器的错误。它适用于单个帖子内的评论——你可以提取成千上万的评论。要从一个社区收集超过1,000个帖子,需要多次查看:

# combine sorts to break past the 1,000-item cap
seen, posts = set(), []
for sort in ("new", "top", "hot", "controversial"):
    for post in fetch_listing("webscraping", sort=sort, pages=10):
        if post["id"] not in seen:
            seen.add(post["id"])
            posts.append(post)
print(f"{len(posts)} unique posts across four sorts")

速率限制和保持不被封锁

一个IP频繁轮询JSON端点会很快被限制——Reddit返回429并最终封锁。保持收集任务健康的两件事:调整节奏(请求之间的短暂延迟比触发限制器的突发更好)并将其分散到多个IP上,这样没有单个地址承载全部负载。通过住宅代理路由使研究抓取看起来像许多普通读者而不是一个激进的客户端,而Scraper API为你处理这种轮换和节奏。如果你不断遇到429,我们的速率限制和退避指南涵盖了节奏数学。

如何利用它:大规模监听

收集Reddit数据的原因是为了倾听。跟踪你的品牌或竞争对手在各个社区的提及,分析评论树的情感,观察一个小众子版块中值得围绕构建的经常性问题,或在趋势进入主流之前发现它。对于任何超出关键词匹配的内容,通过LLM提取步骤将原始文本转化为结构化信号——主题、投诉、功能请求。Reddit的公共数据是可以收集的,但它是人们的帖子;如果你计划处理用户名或个人详细信息,我们关于2026年抓取合法性的概述值得一读(信息性,不是法律建议)。

Reddit收集循环:通过住宅出口分页.json端点,按帖子ID去重,并使用数据进行监听
分页JSON,跨干净IP调整节奏,按全名去重,数据用于品牌监听或趋势研究。

在干净的住宅IP上收集Reddit数据

常见问题解答

在API更改后还能抓取Reddit吗?

可以。官方API现在是付费的,但每个Reddit页面背后的公共.json端点仍然通过简单的HTTP GET返回结构化数据,无需OAuth。它有速率限制,所以调整请求节奏并分散到多个IP上,但对于研究规模的收集,它仍然是最实用的途径。old.reddit.com和RSS提要是额外的轻量级来源。

为什么Reddit在1,000个帖子时停止?

Reddit限制任何单个列表——子版块排序、用户历史、搜索——大约在1,000项平台范围内;分页光标会简单地停止。这不是你的抓取器。通过结合排序(new、top、hot、controversial)、应用时间过滤器、使用搜索和运行增量任务来突破它,这样可以在帖子过期之前捕获它们。

抓取Reddit需要代理吗?

对于少量请求,不需要。对于持续收集,你需要:一个IP频繁访问JSON端点会被429限制然后封锁。住宅代理分散负载,使流量看起来像许多普通读者,而请求之间的节奏保持在限制器之下。它们一起让研究抓取能够持续运行而不触发防御。

抓取Reddit合法吗?

收集公开可见的页面在广泛的范围内是可辩护的,但Reddit的条款限制自动访问,数据包括用户生成的内容和用户名。保持在公共数据范围内,尊重速率限制,并小心处理任何识别个人的内容。这是一般信息,不是法律建议——在进行大型项目之前检查Reddit的当前条款和你的司法管辖区。

API变为付费并没有锁上门——只是移动了把手。.json端点、光标分页以及1,000项限制的策略可以获取数据;住宅IP和礼貌的节奏保持收集运行。从那里开始就是一个监听问题,而Reddit是你可以指向的最佳信号之一。如果你还想了解其他平台的API定价故事,我们关于X/Twitter数据无API的文章描绘了同样的领域。

使用Scraper API大规模抓取Reddit