Google는 Reddit 데이터 라이선스에 매년 6,000만 달러를 내고, OpenAI는 7,000만 달러 규모 계약을 맺은 것으로 알려졌어요. 이 한 가지 사실만으로도 댓글 스레드 속에 어떤 가치가 숨어 있는지 짐작이 가죠. Reddit에서 토론, 댓글, 감성 데이터를 직접 모아본 적 있다면 끝없는 스크롤과 복붙, 탭 지옥이 얼마나 괴로운지 아실 거예요.
지난 분기에 Thunderbit 팀과 함께 2025년에 사람들이 실제로 Reddit 데이터를 어떻게 빼내는지 집중적으로 파봤어요. Reddit이 2023년에 API 요금 정책을 크게 손본 뒤로 판이 완전히 달라졌고, 떠도는 가이드는 대부분 낡았거나 한 가지 방법만 다루더라고요. 그래서 지금 실제로 통하는 것만 추려, Python 스크립팅부터 노코드 추출까지 4가지 접근을 정리했어요. NLP 데이터셋을 만들든, 브랜드 언급을 살피든, 화제 게시글을 스프레드시트로 정리하든 여기서 답을 찾을 수 있을 거예요.
## Reddit 크롤링이란 무엇이며 왜 중요할까?Reddit 크롤링은 Reddit 페이지나 API에서 게시글, 댓글, 사용자 데이터, 메타데이터를 프로그램으로 빼내는 작업이에요. 스레드를 일일이 뒤지며 텍스트를 복사하는 대신, 스크립트나 도구로 구조화된 데이터를 대량 수집하는 거죠.
왜 굳이 할까요? Reddit엔 10만 개 넘는 활성 서브레딧이 있고, 하루 평균 750만 개의 댓글이 생기는 것으로 추정돼요. 제품, 서비스, 경쟁사, 트렌드에 대한 날것의 의견이 모이는 곳이라, 잘 다듬은 리뷰 사이트나 기업 블로그에선 안 나오는 진짜 신호를 건질 수 있어요. Google는 Reddit 콘텐츠 라이선스에 매년 약 $6,000만 달러를 내고 있고, OpenAI 계약은 $7,000만 달러로 보도됐어요. 세계 최대 AI 기업들이 이 데이터를 9자리에 가까운 돈으로 사들인다면, 직접 다룰 줄 알아둘 이유는 충분하죠.
2025년에 Python으로 Reddit을 크롤링해야 하는 이유는?
Python은 Reddit 크롤링의 사실상 표준이에요. PRAW, requests, BeautifulSoup, pandas만 있으면 API 호출부터 데이터 내보내기까지 다 처리돼요. 하지만 이유가 도구뿐인 건 아니에요.
비즈니스·리서치 팀에서 제가 가장 자주 본 활용 사례예요.
| 활용 사례 | 주요 수혜자 | 예시 |
|---|---|---|
| 시장 조사 및 검증 | 제품 매니저, 창업자 | r/SaaS나 r/Entrepreneur에서 반복되는 불편 포인트 찾기 |
| 감성 분석 | 마케팅팀, 브랜드팀 | 자사 제품과 경쟁사에 대해 사람들이 어떻게 말하는지 추적 |
| 리드 발굴 | 영업팀 | 틈새 서브레딧에서 "X 기능을 하는 도구를 찾고 있다"는 글 찾기 |
| 콘텐츠 아이디어 발굴 | 콘텐츠 마케터 | r/marketing이나 r/SEO에서 유행하는 질문과 주제 포착 |
| 학술 / NLP 연구 | 연구자, 데이터 과학자 | 댓글 스레드로 감정 분류용 라벨링 데이터셋 구축 |
| 경쟁사 인텔리전스 | 전략팀, 운영팀 | 경쟁사 서브레딧의 반복 불만 모니터링 |
Reddit의 월간 활성 사용자는 2025년에 약 13.6억 명에 닿았고, 주간 활성 순사용자 4억 7,160만 명으로 전년 대비 24% 늘었어요. 또 Google의 2024년 8월 코어 업데이트 이후 Reddit 콘텐츠는 검색 결과에서 약 400% 더 많이 노출돼요.
결국 Reddit에서 모으는 데이터는 점점 Google이 검색 사용자에게 보여주는 데이터와 같아지고 있다는 뜻이에요.
Reddit 크롤링 방법, 어떤 걸 써야 할까? (빠른 비교)
Reddit 크롤링 포럼에서 가장 많이 나오는 질문은 말 그대로 「어떤 방법을 써야 하나요?」예요. 그래서 비교표를 만들었어요. 본인에게 맞는 줄을 골라 바로 시작하면 돼요.
| 기준 | PRAW | .json 엔드포인트 | BeautifulSoup (HTML) | 노코드(Thunderbit) |
|---|---|---|---|---|
| 설정 난이도 | 중간(API 앱 + pip 설치 필요) | 없음(그냥 URL만 있으면 됨) | 중간(pip + DOM 분석 필요) | 매우 낮음(Chrome 확장 프로그램) |
| API 키 필요 여부 | 예 | 아니오 | 아니오 | 아니오 |
| 댓글 크롤링 | 깊게 가능(중첩 트리) | 제한적(최상위) | 수동 파싱 | 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번(Thunderbit)으로 가면 돼요.
무엇이 바뀌었나: Reddit의 2023~2024 API 요금 정책 업데이트와 무료로 가능한 것
대부분의 가이드는 이 부분을 거의 안 다루지만, 지금 Reddit을 크롤링하는 사람에겐 가장 중요한 배경이에요.
2023년 6월, Reddit은 2008년 이후 처음으로 API 접근에 유료 티어를 도입했어요. 여파는 컸죠.
- Pushshift의 공개 사용이 끊겼어요. Reddit은 2023년 5월 Pushshift의 API 접근을 거둬들였어요. Pushshift에 기대던 연구자들(1,700편 이상 학술 논문이 인용)이 하룻밤 새 핵심 데이터 소스를 잃었죠. 과거 데이터 후속은 Arctic Shift인데, 공개 실시간 API 대체재는 없어요.
- 서드파티 앱이 문을 닫았어요. Apollo, Reddit is Fun, Sync, BaconReader 등이 2023년 6월 30일까지 전부 종료됐어요. Reddit이 Apollo 개발자에게 API 비용으로 연 $2,000만 달러를 청구했기 때문이에요.
- 8,500개 넘는 서브레딧이 비공개/중단 상태가 됐어요. r/funny(구독자 4,000만 명), r/gaming, r/science 등이 항의에 동참했어요(NPR).
2025년에도 여전히 무료로 가능한 것:
무료 OAuth 티어는 비상업·개인·학술 용도로 그대로 열려 있고, OAuth 클라이언트 ID당 분당 100회 요청이 가능해요. 이 안에선 PRAW로 중간 규모 크롤링을 무리 없이 할 수 있어요. 비인증 접근(.json 엔드포인트 포함)은 분당 약 10회로 제한돼요.
실무적으로 보면: 소~중규모 작업엔 무료 티어만으로 충분해요. 대규모나 상업 용도라면 Reddit에 엔터프라이즈 접근을 문의하거나, API 키가 필요 없는 .json 엔드포인트나 BeautifulSoup을 쓰거나, 아예 Reddit API에 기대지 않는 Thunderbit 같은 도구를 쓰면 돼요.
시작하기 전에
- 난이도: 초급~중급(방법에 따라 다름)
- 소요 시간: 방법 1
3은 약 1530분, 방법 4는 약 5분 - 준비물:
- Python 3.8+ 설치(방법 1~3)
- Reddit 계정(방법 1)
- Chrome 브라우저(방법 4)
- Thunderbit Chrome 확장 프로그램(방법 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 자격 증명 받기
https://www.reddit.com/prefs/apps로 가서 맨 아래까지 내려요. **"are you a developer? create an app..."**를 클릭하세요.
이렇게 입력해요.
- Name: 설명이 드러나는 이름(예: "my-reddit-scraper")
- App type: script 선택
- Redirect URI:
http://localhost:8080입력(script 앱에선 필수지만 실제로는 안 쓰임) - Description: 선택 사항
Create app를 누르면 자격 증명이 떠요.
- client_id — 앱 이름 바로 아래 14자리 문자열(「personal use script」로 표시)
- client_secret — 「secret」이라 적힌 항목
앱 생성을 마치기 전 Reddit의 Data API Terms와 Responsible Builder Policy에 동의해야 해요.
참고로 2024년 후반부터는 새 개발자가 접근 요청을 내고 승인을 기다려야 할 수 있어요. 처음 PRAW를 쓰는 사람에겐 가장 큰 허들인데, 사실상 우회로는 없어요.
2단계: PRAW 설치하고 Reddit 인스턴스 만들기
터미널을 열고 아래를 실행하세요.
pip install praw pandas
그다음 읽기 전용 Reddit 인스턴스를 만들어요.
import praw
reddit = praw.Reddit(
client_id="YOUR_CLIENT_ID",
client_secret="YOUR_CLIENT_SECRET",
user_agent="python:reddit-scraper:v1.0 (by u/yourname)",
)
# reddit.read_only는 비밀번호 없는 script 앱의 경우 기본적으로 True입니다.
user_agent 형식은 중요해요. Reddit은 python-requests/2.x 같은 흔한 문자열을 적극적으로 제한해요. Reddit이 권장하는 platform:app_id:version (by u/username) 형식을 쓰세요.
3단계: 서브레딧에서 게시글 크롤링하기
아래는 지난 한 달 r/python 인기 게시글을 가져와 pandas DataFrame에 담는 예시예요.
import pandas as pd
subreddit = reddit.subreddit("python")
rows = []
for post in subreddit.top(time_filter="month", limit=500):
rows.append({
"id": post.id,
"title": post.title,
"selftext": post.selftext,
"score": post.score,
"upvote_ratio": post.upvote_ratio,
"num_comments": post.num_comments,
"author": str(post.author) if post.author else "[deleted]",
"created_utc": post.created_utc,
"url": post.url,
"permalink": f"https://reddit.com{post.permalink}",
})
df = pd.DataFrame(rows)
print(df.head())
.top() 대신 .hot(), .new(), .controversial()도 되고, time_filter엔 "all", "day", "hour", "month", "week", "year"를 넣을 수 있어요.
한 가지 주의할 점은 Reddit이 어떤 목록이든 최대 약 1,000개까지만 준다는 거예요. limit을 더 키워도 소용없어요. PRAW 제한이 아니라 Reddit 쪽 상한이에요.
4단계: Reddit 데이터를 CSV 또는 Excel로 내보내기
df.to_csv("reddit_python_top.csv", index=False)
df.to_json("reddit_python_top.json", orient="records", lines=True)
PRAW는 속도 제한도 자동으로 챙겨요. 응답마다 X-Ratelimit-Remaining과 X-Ratelimit-Reset 헤더를 읽고 필요할 때 알아서 기다려요. 중간 규모 크롤링이면 수동 딜레이를 거의 안 넣어도 돼요.
Python으로 Reddit 댓글까지 크롤링하는 방법(깊은 중첩 스레드)
댓글 크롤링은 대부분 여기서 막혀요.
Reddit 댓글은 트리 구조예요. 댓글 아래에 하위 댓글이 달리고, 일부 분기는 "load more comments" 링크 뒤에 접혀 있어요. PRAW에선 이런 숨은 분기가 MoreComments 객체로 나타나요.
개념적으로 보면 이래요.
Submission (t3_abc123)
├── Comment A (top-level)
│ ├── Reply A1
│ │ └── Reply A1a
│ └── Reply A2
├── Comment B (top-level)
│ └── MoreComments (hidden — "load more comments")
└── MoreComments (hidden — "continue this thread")
replace_more()로 숨겨진 댓글 모두 가져오기
replace_more()는 댓글 트리를 돌며 각 MoreComments 자리표시자를 실제 댓글로 바꿔요.
submission = reddit.submission(id="abcdef")
submission.comments.replace_more(limit=10) # 큰 스레드에서는 현실적인 상한선
all_comments = submission.comments.list() # 평면화된 breadth-first
limit=None이면 모든 MoreComments 노드를 전부 교체해요. 다만 댓글이 5,000개 넘는 스레드에선 각 교체가 최대 약 100개만 돌려주는 API 요청이라 몇 분씩 걸릴 수 있어요. 큰 스레드면 limit=10이나 limit=20부터 시작하고, 완전성이 정말 필요할 때만 값을 올리는 걸 권해요.
중첩 댓글을 표 형태로 평탄화하기
rows = []
for c in all_comments:
rows.append({
"comment_id": c.id,
"parent_id": c.parent_id, # t1_xxx = 부모 댓글, t3_xxx = submission
"depth": c.depth,
"author": str(c.author) if c.author else "[deleted]",
"body": c.body,
"score": c.score,
"created_utc": c.created_utc,
"is_submitter": c.is_submitter,
})
comments_df = pd.DataFrame(rows)
최상위 댓글의 parent_id는 t3_로 시작해요(게시글의 fullname). depth 열은 각 댓글이 얼마나 깊은지 알려줘서 필터링이나 시각화에 좋아요. 한 가지 주의할 점은 삭제·제거·스팸 필터링된 댓글은 트리에서 빠져서 len(all_comments)가 보통 submission.num_comments와 안 맞는다는 거예요.
방법 2: .json 엔드포인트 활용 — API 키 없이 Reddit 크롤링하기
아무 Reddit URL 뒤에 .json만 붙이면 끝이에요. 인증도, 앱 등록도, pip 설치도 없이 구조화된 JSON을 받아요.
예: https://www.reddit.com/r/python/hot.json
이 꼼수는 커뮤니티에서 정말 자주 언급되는데, 정작 제대로 다루는 튜토리얼은 거의 없어요.
동작하는 Python 코드 예시
import requests
headers = {"User-Agent": "python:reddit-scraper:v1.0 (by /u/yourname)"}
r = requests.get(
"https://www.reddit.com/r/python/hot.json",
headers=headers,
params={"limit": 100},
)
data = r.json()
for post in data["data"]["children"]:
p = post["data"]
print(p["title"], p["score"], p["num_comments"], p["author"])
User-Agent 헤더는 아주 중요해요. Reddit은 python-requests/2.31.0 같은 흔한 사용자 에이전트를 차단하거나 속도를 제한해요. Simon Willison이 기록한 것처럼 「이 속도 제한은 user-agent 기반」이에요. PRAW와 같은 설명형 형식을 쓰세요.
after 파라미터로 페이지네이션 처리하기
.json 엔드포인트는 기본 약 25개를 반환하고, 요청당 최대 100개까지 돼요. 더 받으려면 응답의 after 커서를 쓰면 돼요.
import requests, time
headers = {"User-Agent": "python:reddit-scraper:v1.0 (by /u/yourname)"}
after = None
all_posts = []
for _ in range(10): # 최대 약 1000개 게시글
r = requests.get(
"https://www.reddit.com/r/python/hot.json",
headers=headers,
params={"limit": 100, "after": after},
)
data = r.json()
all_posts.extend(data["data"]["children"])
after = data["data"].get("after")
if not after:
break
time.sleep(6) # ~10 QPM = 6초마다 1회 요청
after는 커서 토큰이에요(형식: t3_xxxxxx). PRAW와 마찬가지로 페이지네이션 합계는 약 1,000개가 상한이에요.
.json 방식의 한계
- 깊은 댓글 트리 접근 불가 — 최상위 댓글과 "more" 자리표시자 한 단계까지만 가능하고, PRAW의
replace_more()처럼 자동 확장은 안 돼요 - 읽기 전용 — 투표, 게시, 모더레이션 불가
- 비인증 트래픽은 분당 약 10회 요청으로 제한 — 공격적인 루프는 429 오류를 부를 수 있어요
- 인증 API와 동일한 1,000개 항목 상한
이 방법은 빠른 일회성 수집, 프로토타이핑, 또는 API 앱을 등록하기 싫을 때 가장 잘 맞아요.
방법 3: BeautifulSoup으로 Reddit 크롤링하기(HTML 파싱)
웹 크롤링을 해봤다면 BeautifulSoup은 익숙할 거예요. Reddit에 한해 핵심은 새 React 프런트엔드 대신 old.reddit.com을 쓰는 거예요. 구 버전 인터페이스는 서버 렌더링이라 더 가볍고 파싱도 훨씬 쉬워요. 2025~2026년 여러 가이드도 여전히 살아 있고 크롤링 친화적이라고 확인해요.
Requests와 BeautifulSoup 설정하기
pip install requests beautifulsoup4
import requests
from bs4 import BeautifulSoup
headers = {"User-Agent": "python:reddit-scraper:v1.0 (by /u/yourname)"}
r = requests.get("https://old.reddit.com/r/python/", headers=headers)
soup = BeautifulSoup(r.text, "html.parser")
DOM에서 게시글 데이터 추출하기
old.reddit.com에선 각 게시글이 thing 클래스가 붙은 <div> 안에 들어 있어요. 가장 안정적인 셀렉터는 data-* 속성이에요.
for thing in soup.select("div#siteTable > div.thing"):
title_el = thing.select_one("a.title")
print({
"title": title_el.get_text(strip=True) if title_el else None,
"author": thing.get("data-author"),
"score": thing.get("data-score"),
"comments": thing.get("data-comments-count"),
"domain": thing.get("data-domain"),
"url": title_el.get("href") if title_el else None,
})
중첩된 클래스 셀렉터보다 data-* 속성을 우선하세요. Reddit은 클래스명을 여러 번 바꿔왔지만, 데이터 속성은 템플릿 기반이라 거의 안 변해요.
old.reddit.com에서 페이지네이션 처리하기
import time
url = "https://old.reddit.com/r/python/"
all_rows = []
while url:
r = requests.get(url, headers=headers)
soup = BeautifulSoup(r.text, "html.parser")
for thing in soup.select("div#siteTable > div.thing"):
title_el = thing.select_one("a.title")
all_rows.append({
"title": title_el.get_text(strip=True) if title_el else None,
"author": thing.get("data-author"),
"score": thing.get("data-score"),
"comments": thing.get("data-comments-count"),
"url": title_el.get("href") if title_el else None,
})
nxt = soup.select_one("span.next-button a")
url = nxt["href"] if nxt else None
time.sleep(2) # 예의 있는 딜레이
BeautifulSoup vs. PRAW, 언제 무엇을 써야 할까?
BeautifulSoup은 DOM 크롤링을 배우고 싶거나, OAuth 앱 등록을 하기 싫거나, PRAW가 안 내주는 커스텀 필드가 필요할 때 잘 맞아요. 하지만 더 취약해요. HTML 구조는 예고 없이 바뀔 수 있고, 2025년의 IP 차단은 예전보다 훨씬 공격적이며, 페이지네이션과 오류 처리도 전부 직접 짜야 해요. 안정성과 깊이는 PRAW가 더 나아요.
방법 4: Thunderbit으로 코딩 없이 Reddit 크롤링하기
「Python으로 Reddit 크롤링하는 법」을 찾는 사람 상당수는 사실 Python을 쓰고 싶은 게 아니에요. 그냥 데이터가 필요한 거죠. 그렇다면 이 섹션이 탈출구예요.
Thunderbit은 저희 팀이 이런 용도로 만든 AI 기반 Chrome 확장 프로그램이에요. 코드 없이 웹페이지에서 구조화된 데이터를 빼낼 수 있어요.
1단계: Thunderbit 설치 후 Reddit 페이지 열기
Thunderbit Chrome 확장 프로그램을 설치한 뒤, Reddit 서브레딧이나 게시글 페이지(예: reddit.com/r/python)로 가세요.
API 키도, Python 환경도, 터미널 명령도 없어요.
2단계: "AI Suggest Fields"를 클릭하고 AI가 페이지를 읽도록 하기
브라우저 툴바에서 Thunderbit 아이콘을 누르고 **"AI Suggest Fields"**를 클릭하세요. Thunderbit의 AI가 페이지를 스캔해 Post Title, User Name, Upvotes, Comments Count, Date Posted, Post Description, Community Name, Post URL 같은 열을 자동으로 제안해요.
필요에 따라 열을 추가·삭제·이름 변경할 수 있어요. 예를 들어 게시글 제목과 점수만 필요하면 나머지 필드를 지우면 돼요.
3단계: "Scrape"를 클릭하고 데이터 내보내기
**"Scrape"**를 누르면 Thunderbit가 데이터를 빼내고 페이지네이션까지 알아서 처리해요. 표가 채워지면 Excel, Google Sheets, Airtable, Notion으로 바로 내보낼 수 있고, CSV 코드를 따로 짤 필요도 없어요.
더 깊은 데이터가 필요하면 Thunderbit의 하위 페이지 크롤링으로 개별 스레드에 들어가 각 댓글 데이터를 자동으로 보강할 수 있어요. 개념적으론 PRAW의 replace_more()와 비슷한데, 한 줄도 안 짜도 돼요.
보너스: 지속적인 Reddit 모니터링을 위한 예약 크롤링
매일 특정 서브레딧을 추적해야 한다면 — 예를 들어 r/SaaS의 브랜드 언급이나 틈새 커뮤니티의 경쟁사 논의를 살펴야 한다면 — Thunderbit의 예약 크롤러가 반복 실행을 맡아요. 간단한 영어 문장으로 주기만 적으면 돼요(예: "every weekday at 9am"). 그러면 도구가 나머지를 알아서 처리해 연결된 스프레드시트나 데이터베이스로 최신 데이터를 보내줘요.
Thunderbit의 Reddit 크롤링 기능을 더 알고 싶다면 Thunderbit YouTube 채널을 참고하세요.
Python으로 Reddit을 크롤링할 때의 팁과 모범 사례
아래는 제가 직접 시행착오로 배운 것들이에요. 위에서 어떤 방법을 골랐든 다 적용돼요.
Reddit의 이용약관과 속도 제한을 지키세요
Reddit의 Data API Terms는 서면 승인 없는 상업적 크롤링을 명시적으로 금지해요. 이 규정은 API뿐 아니라 모든 접근 방식에 적용돼요. 개인·학술·내부 연구 용도라면 무료 OAuth 티어와 Thunderbit 업무 흐름이 합리적 사용 범위에 들어가요.
속도 제한 요약이에요.
| 상황 | 제한 | 결과 |
|---|---|---|
| 인증됨(OAuth) | 분당 60~100회 요청 | PRAW가 자동 관리 |
| 비인증(.json, HTML) | 분당 약 10~30회 요청 | 429 Too Many Requests |
| 일반적인 User-Agent | 강하게 제한됨 | 403 Forbidden 또는 조용한 차단 |
항상 설명적인 User-Agent 문자열을 설정하세요. 초보 크롤러가 429나 403을 가장 자주 만나는 이유가 바로 이거예요.
데이터를 깔끔하게 저장하고 구조화하세요
- 예측 가능한 CSV/Excel 내보내기를 위해 pandas DataFrame의 열 순서를 명시적으로 관리하세요
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 같은 서브레딧에서 「X 기능을 하는 도구를 찾고 있다」는 글을 살피세요. 매칭된 글을 리드 리스트나 CRM으로 보내면 돼요. 일일 모니터링엔 Thunderbit의 예약 크롤러가 유용해요.
- 마케팅 및 콘텐츠팀: 브랜드 언급을 추적하고, 감성 추이를 보고, 화제 질문을 콘텐츠 아이디어로 쓰세요. Reddit 내보내기 결과를 Google Sheets와 연결해 팀 협업에도 쓸 수 있어요.
- 이커머스 및 운영팀: 경쟁사 제품 관련 논의를 살펴 반복되는 불만을 찾으세요. r/BuyItForLife나 특정 산업 커뮤니티는 제품 피드백의 보고예요.
- 연구자 및 분석가: NLP 데이터셋을 만드세요. 2024년 학술 논문들은 감성·감정 분류용으로 3만 7천 개 댓글에서 5만 4천 개 댓글 규모 데이터셋을 썼어요. PRAW로 모은 말뭉치는 동료 평가에서도 인용 가능하고요.
효과적인 도구로 소셜 미디어 데이터를 크롤링하는 방법이나 웹사이트에서 Excel로 데이터 추출하는 방법도 더 보고 싶다면, Thunderbit 블로그에서 관련 내용을 자세히 다뤘어요.
마무리
2025년의 Reddit 크롤링은 2년 전과 완전히 다른 모습이에요. 2023년 API 변경으로 Pushshift는 사라졌고, 사랑받던 서드파티 앱들이 종료됐으며, 유료 티어가 생겼어요.
하지만 개인·학술 용도라면 무료 티어는 여전히 잘 돌아가고, 데이터를 얻는 길도 훨씬 다양해졌어요.
각 방법을 한 줄로 정리하면 이래요.

Python 고수든, 점심 전에 스프레드시트가 필요하든, 위 4가지 중 하나는 분명 도움이 될 거예요. 코드를 아예 건너뛰고 싶다면 Thunderbit를 무료로 사용해 보기를 눌러 Reddit을 클릭 몇 번으로 처리하는 방식을 확인해 보세요. Python 크롤링 실력을 계속 키우고 싶다면 이 가이드를 즐겨찾기에 넣어두세요. Reddit 생태계가 계속 바뀌는 만큼 저도 내용을 계속 업데이트할 예정이에요.
웹 크롤링 방식을 더 알고 싶다면 Python으로 웹 크롤링하는 방법, 최고의 Python 웹 크롤링 도구, 웹 크롤링 모범 사례도 참고해 보세요.
자주 묻는 질문
Python으로 Reddit을 크롤링하는 건 합법인가요?
Reddit의 Data API Terms는 서면 승인 없는 상업적 크롤링을 금지해요. 무료 OAuth 티어는 개인·비상업·학술 용도로 쓸 수 있어요. 법적 해석은 전달 방식과 무관하게, API를 쓰든 .json 엔드포인트를 쓰든 HTML 크롤링을 하든 똑같이 적용돼요. 대량 수집 전엔 항상 Reddit의 최신 약관을 확인하세요.
Reddit의 2023년 API 변경 이후에도 PRAW는 계속 작동하나요?
네. PRAW 7.8.1(2024년 10월 기준)은 활발히 유지보수되고 있고, 분당 100회 무료 OAuth 티어 범위 안에서 자동으로 돌아가요. 2023년 요금 변경은 주로 대량 상업용 API 사용에 영향을 줬고, 일반적인 PRAW 크롤링 패턴엔 큰 영향이 없었어요.
API 키 없이 Reddit을 크롤링할 수 있나요?
네. .json 엔드포인트와 BeautifulSoup 기반 HTML 파싱은 둘 다 API 키 없이 동작해요. Thunderbit도 API 키가 필요 없고요. 다만 이 세 방법 모두 상업적 사용 시 Reddit의 이용약관을 따라야 해요.
게시글뿐 아니라 Reddit 댓글도 어떻게 크롤링하나요?
PRAW에선 submission.comments.replace_more(limit=10)을 실행한 뒤 submission.comments.list()로 중첩 댓글 트리를 평면화하면 돼요. Thunderbit에선 하위 페이지 크롤링으로 각 스레드의 댓글 데이터를 게시글 목록에 자동으로 보강할 수 있어요.
코딩 없이 Reddit을 가장 빨리 크롤링하는 방법은 무엇인가요?
Thunderbit Chrome 확장 프로그램을 쓰면 두 번의 클릭으로 Reddit 게시글과 댓글을 크롤링해 Excel, Google Sheets, Airtable, Notion으로 바로 내보낼 수 있어요. Python도, API 키도, 별도 설정도 없어요.
더 알아보기


