Google 每年支付 6000 万美元来授权使用 Reddit 数据。OpenAI 的相关交易据称高达 7000 万美元。光是这一点,就足以说明那些评论串里到底藏着多少价值。如果你曾经尝试手动收集 Reddit 上的讨论串、评论或情绪数据,你一定深有体会:无休止地滚动、复制粘贴,还有满屏标签页带来的崩溃感。
过去一个季度,我花了相当多时间帮 Thunderbit 团队研究 2025 年人们到底是怎么提取 Reddit 数据的。自 Reddit 在 2023 年调整 API 收费规则以来,整个环境已经发生了巨大变化,而网上大多数教程不是过时了,就是只讲一种方法。所以我把现在真正可用的方案都整理到了一起——从完整的 Python 脚本,到完全零代码的数据提取,一共四种路径,方便你按自己的技术水平和使用场景选择。无论你是要搭建 NLP 数据集、监控某个 subreddit 的品牌提及,还是只想把热门帖子整理成表格,这篇指南都能帮到你。
什么是 Reddit 抓取?为什么它很重要?
Reddit 抓取,指的是通过程序化方式从 Reddit 页面或 API 中提取帖子、评论、用户数据和元数据。你不需要手动浏览帖子、逐条复制文字,而是用脚本或工具批量收集结构化数据。
为什么值得做?Reddit 拥有超过 ,据估计每天会产生约 。这里聚集了人们对产品、服务、竞品和趋势的真实看法——这种未经修饰的反馈,几乎不可能在精修过的评测网站或企业博客里找到。Google 每年大约支付 获取 Reddit 内容授权,而 OpenAI 的交易据称达到 。如果全球最大的 AI 公司都愿意为这些数据付出九位数级别的成本,那你也很值得学会如何自己获取。
2025 年为什么要用 Python 抓取 Reddit?
Python 几乎就是 Reddit 抓取的默认语言——PRAW、requests、BeautifulSoup 和 pandas 能覆盖从 API 调用到数据导出的每一步。但“为什么用 Python”不只是工具问题。
以下是我在商业和研究团队里最常见的使用场景:
| 使用场景 | 受益人群 | 示例 |
|---|---|---|
| 市场调研与验证 | 产品经理、创始人 | 从 r/SaaS 或 r/Entrepreneur 中挖掘反复出现的痛点 |
| 情绪分析 | 市场团队、品牌团队 | 追踪人们如何谈论你的产品与竞品 |
| 线索挖掘 | 销售团队 | 在细分 subreddit 中寻找“正在找能实现 X 的工具”这类帖子 |
| 内容选题 | 内容营销人员 | 在 r/marketing 或 r/SEO 中捕捉热门问题与话题 |
| 学术 / NLP 研究 | 研究人员、数据科学家 | 从评论串中构建带标签的数据集,用于情绪分类 |
| 竞品情报 | 战略、运营团队 | 监控竞品 subreddit 中反复出现的抱怨 |
Reddit 的用户规模在 2025 年估计已达到 ,每周活跃独立用户约 ,同比增长 24%。而在 Google 2024 年 8 月核心更新之后,Reddit 内容在自然搜索结果中的可见度大约提升了 。
换句话说:你从 Reddit 抓到的数据,越来越接近 Google 会优先展示给搜索用户的那批数据。
应该用哪种方法抓取 Reddit?(快速对比)
Reddit 抓取论坛里最常见的问题,几乎就是“我到底该用哪种方法?”所以我做了这张表。直接按你的需求选就行。
| 对比项 | PRAW | .json 端点 | BeautifulSoup(HTML) | 无代码(Thunderbit) |
|---|---|---|---|---|
| 配置复杂度 | 中等(要建 API 应用 + pip 安装) | 无(只要一个 URL) | 中等(pip + DOM 解析) | 很低(Chrome 扩展) |
| 需要 API key 吗? | 需要 | 不需要 | 不需要 | 不需要 |
| 评论抓取 | 深度抓取(嵌套树) | 有限制(仅顶层) | 手动解析 | AI 结构化提取 |
| 分页 | 内置支持 | 手动(after 参数) | 手动 | 自动 |
| 限流 | 100 次请求/分钟(PRAW 管理) | 约 10 次请求/分钟(未认证) | 有被封 IP 风险 | 工具自动处理 |
| 最适合 | 功能完整的项目、研究 | 快速临时提取 | 学习 / 自定义 | 不写代码、快速导出 |
| 导出选项 | CSV、JSON(手动代码) | JSON(原始) | 自定义(手动代码) | Excel、Google Sheets、Airtable、Notion |
如果你要做功能完整的 Python 项目,并且需要深度评论提取,先从方法 1(PRAW)开始。如果你只想在 10 分钟内快速抓一份数据,而且不想做任何配置,就试试方法 2(.json 技巧)。如果你想学习 HTML 抓取,或者需要自定义字段,那就用方法 3(BeautifulSoup)。如果你干脆不想碰 Python,只想直接拿到数据,那就跳到方法 4()。
发生了什么变化:Reddit 2023–2024 API 调价更新(以及现在仍然免费能做什么)
几乎没有抓取教程会讲这个——但这恰恰是今天抓取 Reddit 时最重要的背景。
2023 年 6 月,Reddit 自 2008 年以来首次推出 API 付费分层。随后影响非常大:
- Pushshift 对公众用途失效。 Reddit 在 2023 年 5 月撤销了 Pushshift 的 API 访问权限。依赖它的研究者(据称已有超过 引用了 Pushshift)一夜之间失去了主要数据来源。历史数据的替代方案是 ,但并没有面向公众的实时 API 替代品。
- 第三方应用纷纷关闭。 Apollo、Reddit is Fun、Sync、BaconReader 等应用都在 2023 年 6 月 30 日前后停止服务,因为 Reddit 给 Apollo 开发者报出的 API 费用高达每年 。
- 超过 8500 个 subreddit 关闭访问。 包括 r/funny(4000 万订阅者)、r/gaming 和 r/science 在内的多个社区都参与了抗议并“熄灯”()。
2025 年仍然免费的部分:
仍然可用于非商业、个人和学术用途——每个 OAuth client ID 每分钟 100 次查询。PRAW 在这个额度下完全可以稳定使用,适合中等规模的抓取。未认证访问(包括 .json 端点)大约限制在每分钟 10 次请求。
实用结论: 对于小到中等规模的抓取任务,免费额度完全够用。若是大规模或商业用途,你要么联系 Reddit 获取企业级访问权限,要么使用不需要 API key 的 .json 端点或 BeautifulSoup,要么直接用不依赖 Reddit API 的 Thunderbit 这类工具。
开始之前
- 难度: 初级到中级(视方法而定)
- 所需时间: 方法 1–3 约 15–30 分钟;方法 4 约 5 分钟
- 你需要准备:
- 已安装 Python 3.8+(方法 1–3)
- 一个 Reddit 账号(方法 1)
- Chrome 浏览器(方法 4)
- (方法 4)
方法 1:使用 PRAW 用 Python 抓取 Reddit(逐步教程)
PRAW(Python Reddit API Wrapper)是用 Python 抓取 Reddit 最流行、文档最完善的方法。它会帮你处理认证、限流和分页,而且维护活跃——最新稳定版是 PRAW 7.8.1(2024 年 10 月),支持 Python 3.8 到 3.13。
第 1 步:创建 Reddit 应用并获取 API 凭据
前往 ,然后滑到页面底部,点击 “are you a developer? create an app...”。
填写表单:
- Name: 随便起一个描述性名称(例如 “my-reddit-scraper”)
- App type: 选择 script
- Redirect URI: 填入
http://localhost:8080(脚本应用需要填写,但不会真正用到) - Description: 可选
点击 Create app。随后你会看到自己的凭据:
- client_id —— 位于应用名称正下方的 14 位字符串(标注为 “personal use script”)
- client_secret —— 标注为 “secret” 的字段
在应用创建完成前,你还需要接受 Reddit 的 和 。
还要提醒一点:从 2024 年底开始,新开发者可能需要提交访问申请并等待批准。这是首次使用 PRAW 时最大的阻碍,而且基本没有绕过办法。
第 2 步:安装 PRAW 并创建 Reddit 实例
打开终端并运行:
1pip install praw pandas
然后创建一个只读的 Reddit 实例:
1import praw
2reddit = praw.Reddit(
3 client_id="YOUR_CLIENT_ID",
4 client_secret="YOUR_CLIENT_SECRET",
5 user_agent="python:reddit-scraper:v1.0 (by u/yourname)",
6)
7# 没有密码的 script 应用默认就是 read_only=True
user_agent 的格式很重要。Reddit 会主动限流像 python-requests/2.x 这样的通用字符串。请使用 Reddit 推荐的格式:platform:app_id:version (by u/username)。
第 3 步:抓取某个 subreddit 的帖子
下面这个示例会抓取 r/python 过去一个月的热门帖子,并把结果存到 pandas DataFrame 中:
1import pandas as pd
2subreddit = reddit.subreddit("python")
3rows = []
4for post in subreddit.top(time_filter="month", limit=500):
5 rows.append({
6 "id": post.id,
7 "title": post.title,
8 "selftext": post.selftext,
9 "score": post.score,
10 "upvote_ratio": post.upvote_ratio,
11 "num_comments": post.num_comments,
12 "author": str(post.author) if post.author else "[deleted]",
13 "created_utc": post.created_utc,
14 "url": post.url,
15 "permalink": f"https://reddit.com{post.permalink}",
16 })
17df = pd.DataFrame(rows)
18print(df.head())
你可以把 .top() 换成 .hot()、.new() 或 .controversial(),而 time_filter 支持 "all"、"day"、"hour"、"month"、"week" 或 "year"。
需要注意的是:无论你把 limit 设得多高,Reddit 对任何列表接口都大约只返回 1000 条。这是 Reddit 端的上限,不是 PRAW 的限制。
第 4 步:将 Reddit 数据导出为 CSV 或 Excel
1df.to_csv("reddit_python_top.csv", index=False)
2df.to_json("reddit_python_top.json", orient="records", lines=True)
PRAW 会自动处理限流——它会读取每次响应中的 X-Ratelimit-Remaining 和 X-Ratelimit-Reset 头信息,并在需要时自动暂停。因此对于中等规模抓取,通常不需要你手动加延时。
如何用 Python 抓取 Reddit 评论(深度嵌套讨论串)
抓评论通常就是很多人碰到的第一个难点。
Reddit 的评论是树状结构:每条评论都可能有子评论,而某些分支会折叠在“加载更多评论”链接后面。在 PRAW 里,这些隐藏分支会被表示成 MoreComments 对象。
你可以这样理解:
1Submission (t3_abc123)
2├── Comment A (top-level)
3│ ├── Reply A1
4│ │ └── Reply A1a
5│ └── Reply A2
6├── Comment B (top-level)
7│ └── MoreComments (hidden — "load more comments")
8└── MoreComments (hidden — "continue this thread")
使用 replace_more() 获取所有隐藏评论
replace_more() 会遍历评论树,并把每个 MoreComments 占位符替换成它所指向的真实评论:
1submission = reddit.submission(id="abcdef")
2submission.comments.replace_more(limit=10) # 对于大帖子,这是比较实际的上限
3all_comments = submission.comments.list() # 扁平化的广度优先列表
如果把 limit=None,它会替换所有 MoreComments 节点——但如果帖子里有 5000+ 条评论,这可能会花上好几分钟,因为每次替换本质上都是一次 API 请求,而每次最多只返回大约 100 条评论。对于大帖子,我建议先从 limit=10 或 limit=20 开始,只有确实需要完整度时再继续加大。
将嵌套评论整理成表格
1rows = []
2for c in all_comments:
3 rows.append({
4 "comment_id": c.id,
5 "parent_id": c.parent_id, # t1_xxx = 父评论,t3_xxx = submission
6 "depth": c.depth,
7 "author": str(c.author) if c.author else "[deleted]",
8 "body": c.body,
9 "score": c.score,
10 "created_utc": c.created_utc,
11 "is_submitter": c.is_submitter,
12 })
13comments_df = pd.DataFrame(rows)
顶层评论的 parent_id 会以 t3_ 开头(也就是 submission 的 fullname)。depth 列可以告诉你每条评论嵌套了多深——这对筛选或可视化很有用。还有一个容易踩坑的地方:len(all_comments) 通常不会和 submission.num_comments 一致,因为被删除、被移除或被垃圾过滤掉的评论不会出现在树里。
方法 2:用 .json 端点技巧——无需 API key 抓取 Reddit
给任意 Reddit URL 末尾加上 .json 就行。就这么简单。你会拿到结构化 JSON——无需认证、无需注册应用、也无需 pip 安装。
例如:https://www.reddit.com/r/python/hot.json
论坛用户经常提到这个技巧,但几乎没有教程真正系统讲过。
可运行的 Python 代码示例
1import requests
2headers = {"User-Agent": "python:reddit-scraper:v1.0 (by /u/yourname)"}
3r = requests.get(
4 "https://www.reddit.com/r/python/hot.json",
5 headers=headers,
6 params={"limit": 100},
7)
8data = r.json()
9for post in data["data"]["children"]:
10 p = post["data"]
11 print(p["title"], p["score"], p["num_comments"], p["author"])
User-Agent 头非常关键。Reddit 会屏蔽或限制像 python-requests/2.31.0 这样的通用 UA——正如 ,“这个限流是基于 user-agent 的。”请像 PRAW 一样使用描述性格式。
如何使用 after 参数处理分页
.json 端点默认只返回约 25 条结果(每次最多 100 条)。如果想继续拿更多,就要使用响应中的 after 游标:
1import requests, time
2headers = {"User-Agent": "python:reddit-scraper:v1.0 (by /u/yourname)"}
3after = None
4all_posts = []
5for _ in range(10): # 最多约 1000 条帖子
6 r = requests.get(
7 "https://www.reddit.com/r/python/hot.json",
8 headers=headers,
9 params={"limit": 100, "after": after},
10 )
11 data = r.json()
12 all_posts.extend(data["data"]["children"])
13 after = data["data"].get("after")
14 if not after:
15 break
16 time.sleep(6) # 约 10 QPM = 每 6 秒一次请求
after 是一个游标 token(格式:t3_xxxxxx)。和 PRAW 一样,多页请求的总上限大约也是 1000 条。
.json 方法的限制
- 无法深度访问评论树——你只能拿到顶层评论以及一层 “more” 占位内容,不能像 PRAW 的
replace_more()那样自动展开 - 只读——不能投票、发帖或做版务操作
- 未认证流量约 10 次请求/分钟——如果循环太激进,会触发 429 错误
- 列表总量上限同样是 1000 条,和认证 API 一样
这个方法非常适合快速临时抓取、原型验证,或者你不想注册 API 应用的场景。
方法 3:用 BeautifulSoup 抓取 Reddit(HTML 解析)
如果你做过任何网页抓取,大概率听过 BeautifulSoup。针对 Reddit 的关键技巧是:不要用新的 React 前端,而要用 old.reddit.com。旧版界面是服务端渲染的,页面更轻,也更容易解析—— 都确认它现在依然可用,而且对爬虫友好。
配置 Requests 和 BeautifulSoup
1pip install requests beautifulsoup4
1import requests
2from bs4 import BeautifulSoup
3headers = {"User-Agent": "python:reddit-scraper:v1.0 (by /u/yourname)"}
4r = requests.get("https://old.reddit.com/r/python/", headers=headers)
5soup = BeautifulSoup(r.text, "html.parser")
从 DOM 中提取帖子数据
在 old.reddit.com 上,每个帖子都位于一个 class 为 thing 的 <div> 中。最稳定的选择器是 data-* 属性:
1for thing in soup.select("div#siteTable > div.thing"):
2 title_el = thing.select_one("a.title")
3 print({
4 "title": title_el.get_text(strip=True) if title_el else None,
5 "author": thing.get("data-author"),
6 "score": thing.get("data-score"),
7 "comments": thing.get("data-comments-count"),
8 "domain": thing.get("data-domain"),
9 "url": title_el.get("href") if title_el else None,
10 })
优先使用 data-* 属性,而不是嵌套的 class 选择器——Reddit 这些年经常调整 class 名,但数据属性通常来自模板,变化频率低得多。
处理 old.reddit.com 的分页
1import time
2url = "https://old.reddit.com/r/python/"
3all_rows = []
4while url:
5 r = requests.get(url, headers=headers)
6 soup = BeautifulSoup(r.text, "html.parser")
7 for thing in soup.select("div#siteTable > div.thing"):
8 title_el = thing.select_one("a.title")
9 all_rows.append({
10 "title": title_el.get_text(strip=True) if title_el else None,
11 "author": thing.get("data-author"),
12 "score": thing.get("data-score"),
13 "comments": thing.get("data-comments-count"),
14 "url": title_el.get("href") if title_el else None,
15 })
16 nxt = soup.select_one("span.next-button a")
17 url = nxt["href"] if nxt else None
18 time.sleep(2) # 礼貌性延时
什么时候选 BeautifulSoup,什么时候选 PRAW?
当你想学习 DOM 抓取、不想注册 OAuth 应用,或者需要 PRAW 没有暴露的自定义字段时,BeautifulSoup 是个不错的选择。但它更脆弱——HTML 结构可能在没有通知的情况下变化,而且 2025 年的 IP 封禁也比以前更严格,你还得自己写分页和错误处理。若看重稳定性和抓取深度,PRAW 更胜一筹。
方法 4:不用代码,用 Thunderbit 抓取 Reddit
坦白说:很多搜“how to scrape Reddit with Python”的人,其实并不想写 Python,他们只是想要数据。如果你是这种情况,这一部分就是你的快速出口。
是我们团队专门为这类场景打造的 AI 驱动 Chrome 扩展——无需编写代码,就能从网页中提取结构化数据。
第 1 步:安装 Thunderbit 并打开 Reddit 页面
安装 ,然后打开任意 Reddit subreddit 或帖子页面(例如 reddit.com/r/python)。
不需要 API key,不需要 Python 环境,也不需要命令行。
第 2 步:点击“AI Suggest Fields”,让 AI 读取页面
点击浏览器工具栏里的 Thunderbit 图标,然后点击 “AI Suggest Fields.” Thunderbit 的 AI 会扫描页面,并自动推荐列名,比如帖子标题、用户名、点赞数、评论数、发布时间、帖子描述、社区名称和帖子 URL。
你可以按需添加、删除或重命名这些列。例如,如果你只关心标题和分数,直接删掉其他字段就行。
第 3 步:点击“Scrape”并导出数据
点击 “Scrape”,Thunderbit 就会开始提取数据,并自动处理分页。表格填充完成后,你可以直接导出到 Excel、Google Sheets、Airtable 或 Notion——无需写任何 CSV 代码。
如果你需要更深层的数据,Thunderbit 的子页面抓取功能可以让你点进每个帖子线程,自动把评论数据补充进表格里。从概念上说,这和 PRAW 的 replace_more() 很像——但你完全不用写一行代码。
额外功能:定时抓取,持续监控 Reddit
如果你需要每天追踪某个 subreddit——比如监控 r/SaaS 中的品牌提及,或者观察某个细分社区中的竞品讨论——Thunderbit 的定时爬虫可以自动重复运行。你只需要用自然语言描述间隔(例如“每个工作日上午 9 点”),工具就会自动完成剩下的工作,并把最新数据推送到你连接的表格或数据库中。
你可以在 了解更多 Thunderbit 的 Reddit 抓取能力。
用 Python 抓取 Reddit 的技巧与最佳实践
下面这些经验大多是我踩坑后才学到的——无论你上面选的是哪种方法,都适用。
遵守 Reddit 的服务条款和限流规则
Reddit 的 明确禁止未经书面批准的商业抓取——这一点适用于所有访问方式,不只是 API。对于个人、学术和内部研究用途,免费 OAuth 层以及 Thunderbit 的工作流都在合理使用范围内。
限流速查表:
| 场景 | 限制 | 结果 |
|---|---|---|
| 已认证(OAuth) | 60–100 次请求/分钟 | PRAW 会自动管理 |
| 未认证(.json、HTML) | 约 10–30 次请求/分钟 | 429 Too Many Requests |
| 通用 User-Agent | 限制非常严 | 403 Forbidden 或静默封禁 |
务必设置一个有描述性的 User-Agent 字符串。这是新手抓取 Reddit 时最常见的 429 或 403 错误原因。
让数据存储和结构更清晰
- 用 pandas DataFrame 并固定列顺序,导出 CSV/Excel 时更可控
- 将
created_utc转成可读时间:pd.to_datetime(df["created_utc"], unit="s") - 如果同时抓取 hot、new 和 top,记得按
id去重,因为这些排序结果通常会重叠 - 处理被删除的作者:
str(post.author) if post.author else "[deleted]"
优雅地处理常见错误
| 错误 | 原因 | 修复方式 |
|---|---|---|
| 429 Too Many Requests | 超出限流(OAuth 为 60–100 次请求/分钟) | 使用指数退避;检查 X-Ratelimit-Reset 头 |
| 403 Forbidden | User-Agent 不合规或 IP 被拦截 | 使用唯一且描述性的 UA;确认 OAuth 应用已激活 |
None author | 账号已删除或被封停 | 用 if post.author else "[deleted]" 包裹处理 |
prawcore.TooManyRequests | 触发 PRAW 层面的限流缓冲 | 增加 ratelimit_seconds 或将请求均匀分散 |
| 大型树结构出现 5xx 或 413 | 深层线程导致 Reddit 后端过载 | 为 replace_more() 加重试逻辑;限制递归深度 |
Reddit 抓取的应用场景:拿到数据后能做什么?
抓取只是第一步。真正能带来价值的是后面的应用:
- 销售团队: 监控 r/SaaS、r/smallbusiness 或 r/Entrepreneur 等 subreddit,寻找“正在找能实现 X 的工具”这类帖子。把命中的内容同步到线索列表或 CRM 流程中。也可以用 Thunderbit 的定时爬虫进行每日监控。
- 市场和内容团队: 跟踪品牌提及、分析情绪趋势,并从热门问题中挖掘内容选题。把 Reddit 导出结果和 Google Sheets 结合,方便团队协作。
- 电商和运营团队: 监控竞品产品讨论中的反复抱怨。像 r/BuyItForLife 以及各类垂直社区,都是产品反馈的宝库。
- 研究人员和分析师: 构建 NLP 数据集——2024 年的学术论文就使用了从 到 不等的数据集,用于情绪和情感分类。PRAW 收集到的语料在同行评审中也具有可引用性。
如果你想进一步了解如何用高效工具,或者,Thunderbit 博客里已经有更详细的流程讲解。
总结
2025 年的 Reddit 抓取,和两年前已经完全不是一回事了。2023 年的 API 改动终结了 Pushshift,关停了很多受欢迎的第三方应用,也引入了付费分层。
但免费层对个人和学术用途仍然可用,而且现在获取数据的方法比以前更多。
下面是一句话版总结:

无论你是 Python 老手,还是想中午前就把数据整理成表的人,这四种方法里总有一种适合你。如果你想完全跳过代码,可以直接,看看它如何在几次点击内搞定 Reddit 数据。若你还想继续提升 Python 抓取能力,建议把这篇指南收藏起来——我会随着 Reddit 生态变化持续更新它。
关于更多网页抓取方案,欢迎查看我们关于、 和 的指南。
常见问题
用 Python 抓取 Reddit 合法吗?
Reddit 的 明确禁止未经书面批准的商业抓取。免费 OAuth 层可用于个人、非商业和学术用途。从法律角度看,这不取决于你用什么管道——无论是 API、.json 端点还是 HTML 抓取,规则都一样。大规模抓取前,一定先查看 Reddit 当前的条款。
Reddit 2023 年 API 变化后,PRAW 还好用吗?
可以。PRAW 7.8.1(2024 年 10 月)仍在持续维护中,并会自动在 内运行。2023 年的调价主要影响的是高流量和商业 API 使用,不是普通的 PRAW 抓取模式。
不用 API key 也能抓 Reddit 吗?
可以——.json 端点和 BeautifulSoup 的 HTML 解析都不需要 API key。 也不需要 API key。这三种方法在商业用途上仍然要遵守 Reddit 的服务条款。
如何抓取 Reddit 评论,而不只是帖子?
使用 PRAW 时,先执行 submission.comments.replace_more(limit=10),再执行 submission.comments.list(),就能把嵌套评论树扁平化成列表。使用 Thunderbit 时,可以通过子页面抓取,把帖子列表和每条线程的评论数据自动合并。
不写代码抓取 Reddit 最快的方法是什么?
可以让你两次点击就抓取 Reddit 帖子和评论,并直接导出到 Excel、Google Sheets、Airtable 或 Notion——不需要 Python、不需要 API key,也不需要任何配置。
了解更多
