Google는 Reddit 데이터 라이선스에 매년 6,000만 달러를 지불하고, OpenAI는 7,000만 달러 규모의 계약을 맺은 것으로 알려져 있습니다. 이 사실만 봐도 댓글 스레드 안에 어떤 가치가 숨어 있는지 짐작할 수 있죠. Reddit에서 토론 스레드, 댓글, 감성 데이터를 직접 모아본 적이 있다면 끝없는 스크롤, 복붙, 그리고 탭 지옥이 얼마나 고통스러운지 잘 아실 겁니다.
지난 분기에 저는 Thunderbit 팀과 함께 2025년에 사람들이 실제로 Reddit 데이터를 어떻게 추출하는지 집중적으로 조사했습니다. Reddit이 2023년에 API 요금 정책을 대대적으로 바꾼 뒤, 상황은 완전히 달라졌고 온라인에 떠도는 가이드 대부분은 이미 낡았거나 한 가지 방법만 다루고 있었습니다. 그래서 지금 실제로 통하는 방법만 모아, Python 스크립팅부터 노코드 추출까지 총 4가지 접근법을 정리했습니다. NLP 데이터셋을 만들고 싶든, 브랜드 언급을 모니터링하고 싶든, 아니면 유행하는 게시글을 스프레드시트로 정리하고 싶든 이 가이드에서 필요한 답을 찾을 수 있을 겁니다.
Reddit 크롤링이란 무엇이며 왜 중요할까?
Reddit 크롤링이란 Reddit 페이지나 API에서 게시글, 댓글, 사용자 데이터, 메타데이터를 프로그램으로 추출하는 작업입니다. 스레드를 일일이 뒤져가며 텍스트를 복사하는 대신, 스크립트나 도구를 사용해 구조화된 데이터를 대량으로 수집하는 방식이죠.
굳이 왜 해야 할까요? Reddit에는 이 있고, 하루 평균 이 생성되는 것으로 추정됩니다. 제품, 서비스, 경쟁사, 트렌드에 대한 날것 그대로의 의견이 모이는 곳이라, 세련되게 다듬어진 리뷰 사이트나 기업 블로그에서는 얻기 힘든 진짜 신호를 찾을 수 있습니다. Google는 Reddit 콘텐츠 라이선스에 매년 약 달러를 지불하고 있고, OpenAI의 계약 규모는 달러로 보도됐습니다. 세계 최대 AI 기업들이 이 데이터를 9자리 수에 가까운 금액으로 사들이고 있다면, 직접 다루는 법을 익혀둘 충분한 이유가 있습니다.
2025년에 Python으로 Reddit을 크롤링해야 하는 이유는?
Python은 Reddit 크롤링의 사실상 표준 언어입니다. PRAW, requests, BeautifulSoup, pandas만 있으면 API 호출부터 데이터 내보내기까지 전 과정을 처리할 수 있죠. 하지만 이유는 단순히 도구 때문만은 아닙니다.
제가 비즈니스와 리서치 팀에서 가장 자주 본 활용 사례는 다음과 같습니다.
| 활용 사례 | 주요 수혜자 | 예시 |
|---|---|---|
| 시장 조사 및 검증 | 제품 매니저, 창업자 | r/SaaS나 r/Entrepreneur에서 반복되는 불편 포인트 찾기 |
| 감성 분석 | 마케팅팀, 브랜드팀 | 자사 제품과 경쟁사에 대해 사람들이 어떻게 말하는지 추적 |
| 리드 발굴 | 영업팀 | 틈새 서브레딧에서 "X 기능을 하는 도구를 찾고 있다"는 글 찾기 |
| 콘텐츠 아이디어 발굴 | 콘텐츠 마케터 | r/marketing이나 r/SEO에서 유행하는 질문과 주제 포착 |
| 학술 / NLP 연구 | 연구자, 데이터 과학자 | 댓글 스레드로 감정 분류용 라벨링 데이터셋 구축 |
| 경쟁사 인텔리전스 | 전략팀, 운영팀 | 경쟁사 서브레딧의 반복 불만 모니터링 |
Reddit의 월간 활성 사용자 수는 2025년에 약 에 이르렀고, 을 기록하며 전년 대비 24% 증가했습니다. 또 Google의 2024년 8월 코어 업데이트 이후 Reddit 콘텐츠는 검색 결과에서 약 되고 있습니다.
즉, 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번 방법()으로 가면 됩니다.
무엇이 바뀌었나: Reddit의 2023~2024 API 요금 정책 업데이트와 무료로 가능한 것
대부분의 크롤링 가이드는 이 부분을 거의 다루지 않지만, 지금 Reddit을 크롤링하는 사람에게는 가장 중요한 배경입니다.
2023년 6월, Reddit은 2008년 이후 처음으로 API 접근에 유료 티어를 도입했습니다. 그 여파는 엄청났습니다.
- Pushshift의 공개 사용이 중단됐습니다. Reddit은 2023년 5월 Pushshift의 API 접근을 철회했습니다. Pushshift에 의존하던 연구자들(이 Pushshift를 인용)이 하룻밤 사이에 핵심 데이터 소스를 잃었습니다. 과거 데이터의 후속 서비스는 이지만, 공개 실시간 API 대체재는 없습니다.
- 서드파티 앱이 종료됐습니다. Apollo, Reddit is Fun, Sync, BaconReader 등이 2023년 6월 30일까지 모두 문을 닫았습니다. Reddit이 Apollo 개발자에게 API 비용으로 연 달러를 제시했기 때문입니다.
- 8,500개가 넘는 서브레딧이 비공개/중단 상태가 됐습니다. r/funny(구독자 4,000만 명), r/gaming, r/science 등이 항의에 동참했습니다().
2025년에도 여전히 무료로 가능한 것:
는 비상업적, 개인용, 학술용 사용에 그대로 열려 있으며, OAuth 클라이언트 ID당 분당 100회 요청이 가능합니다. 이 티어 안에서는 PRAW로 중간 규모 크롤링을 문제없이 할 수 있습니다. 비인증 접근(.json 엔드포인트 포함)은 분당 약 10회 요청으로 제한됩니다.
실무적으로 보면: 소규모~중간 규모의 크롤링 작업에는 무료 티어만으로도 충분합니다. 대규모 또는 상업적 용도라면 Reddit에 엔터프라이즈 접근을 문의하거나, API 키가 필요 없는 .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입력(script 앱에서는 필수지만 실제로는 사용되지 않음) - 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# 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에 저장하는 예시입니다.
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"를 넣을 수 있습니다.
주의할 점은 Reddit이 어떤 목록이든 최대 약 1,000개까지만 제공한다는 것입니다. limit을 더 크게 설정해도 소용없습니다. 이건 PRAW 제한이 아니라 Reddit 쪽 상한입니다.
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의 댓글은 트리 구조입니다. 각 댓글 아래에 하위 댓글이 달릴 수 있고, 일부 분기는 "load more comments" 링크 뒤에 접혀 있습니다. 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() # 평면화된 breadth-first
limit=None으로 설정하면 모든 MoreComments 노드를 전부 교체합니다. 하지만 댓글이 5,000개가 넘는 스레드에서는 각 교체가 최대 약 100개 댓글만 돌려주는 API 요청이기 때문에 몇 분씩 걸릴 수 있습니다. 큰 스레드라면 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_로 시작합니다(게시글의 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 코드 예시
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 같은 일반적인 사용자 에이전트를 차단하거나 속도를 제한합니다. , “이 속도 제한은 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초마다 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을 쓰는 것입니다. 구 버전 인터페이스는 서버 렌더링 방식이라 더 가볍고 파싱도 훨씬 쉽습니다. 에서도 여전히 살아 있고 크롤링 친화적이라고 확인하고 있습니다.
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에서는 각 게시글이 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-* 속성을 우선하세요. Reddit은 그동안 클래스명을 여러 번 바꿔왔지만, 데이터 속성은 템플릿 기반이라 거의 변하지 않습니다.
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 vs. PRAW, 언제 무엇을 써야 할까?
BeautifulSoup은 DOM 크롤링을 배우고 싶거나, OAuth 앱 등록을 하고 싶지 않거나, PRAW가 노출하지 않는 커스텀 필드가 필요할 때 잘 맞습니다. 하지만 더 취약합니다. HTML 구조는 예고 없이 바뀔 수 있고, 2025년의 IP 차단은 예전보다 훨씬 공격적이며, 페이지네이션과 오류 처리까지 전부 직접 짜야 합니다. 안정성과 깊이 면에서는 PRAW가 더 낫습니다.
방법 4: Thunderbit으로 코딩 없이 Reddit 크롤링하기
솔직히 말해, "Python으로 Reddit을 크롤링하는 법"을 찾는 사람 중 상당수는 사실 Python을 쓰고 싶은 게 아닙니다. 그냥 데이터가 필요한 거죠. 만약 그렇다면 이 섹션이 탈출구입니다.
은 저희 팀이 이런 용도를 위해 만든 AI 기반 Chrome 확장 프로그램으로, 코드를 작성하지 않고 웹페이지에서 구조화된 데이터를 추출할 수 있습니다.
1단계: Thunderbit 설치 후 Reddit 페이지 열기
을 설치한 뒤, 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 크롤링 기능에 대해 더 알아보려면 을 참고하세요.
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 문자열을 설정하세요. 초보 크롤러가 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년 학술 논문들은 감성 및 감정 분류를 위해 에서 규모의 데이터셋을 사용했습니다. PRAW로 수집한 말뭉치는 동료 평가에서도 인용 가능합니다.
이나 도 더 깊이 보고 싶다면, Thunderbit 블로그에서 관련 워크플로우를 자세히 다뤘습니다.
마무리
2025년의 Reddit 크롤링은 2년 전과는 완전히 다른 모습입니다. 2023년 API 변경으로 Pushshift는 사라졌고, 많은 사랑을 받던 서드파티 앱들이 종료됐으며, 유료 티어가 도입됐습니다.
하지만 개인 및 학술용으로는 무료 티어가 여전히 잘 작동하고, 데이터를 얻는 방법도 훨씬 다양해졌습니다.
각 방법을 한 줄로 정리하면 이렇습니다.

Python 고수든, 점심시간 전에 스프레드시트가 필요하든, 위 4가지 방법 중 하나는 분명 도움이 될 겁니다. 코드를 아예 건너뛰고 싶다면 를 눌러 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 키 없이 Reddit을 크롤링할 수 있나요?
네. .json 엔드포인트와 BeautifulSoup 기반 HTML 파싱은 모두 API 키 없이 동작합니다. 도 API 키가 필요 없습니다. 다만 이 세 가지 방법 모두 상업적 사용 시 Reddit의 이용약관을 따라야 합니다.
게시글뿐 아니라 Reddit 댓글도 어떻게 크롤링하나요?
PRAW에서는 submission.comments.replace_more(limit=10)를 실행한 뒤 submission.comments.list()로 중첩 댓글 트리를 평면화하면 됩니다. Thunderbit에서는 서브페이지 크롤링을 사용해 각 스레드의 댓글 데이터를 게시글 목록에 자동으로 보강할 수 있습니다.
코딩 없이 Reddit을 가장 빨리 크롤링하는 방법은 무엇인가요?
을 사용하면 두 번의 클릭만으로 Reddit 게시글과 댓글을 크롤링해 Excel, Google Sheets, Airtable, Notion으로 바로 내보낼 수 있습니다. Python도, API 키도, 별도 설정도 필요 없습니다.
더 알아보기
