Reddit - методы сбора данных - 2026
Published: 2026-09-29
Reddit даёт один из самых больших корпусов живого пользовательского текста в интернете: миллионы постов и комментариев в день на десятки языков. Логично возникает вопрос — как этот массив вытаскивать технически. Способов минимум семь, и они сильно различаются по скорости, полноте данных и риску бана.
Ключевой момент: с 2023 года Reddit закрыл фактически бесплатный анонимный доступ к данным и сместил всё в OAuth-модель. Методы, которые ещё пять лет назад были бесплатными и работали «из коробки», теперь упираются в лимиты, требуют регистрации приложения или вовсе не работают. Поэтому выбор метода почти всегда сводится к одному вопросу: нужен ли вам live-доступ к свежим постам или достаточно исторического архива.
Ниже — разбор всех подходов от официального API до платных скраперов, с примерами кода, сравнительной таблицей и списком подводных камней. Данные актуальны на 29.09.2026.
Обзор
Сравнительная таблица методов по четырём ключевым параметрам — полноте, скорости, требованиям к авторизации и риску блокировки:
| Метод | Что даёт | Лимит | Авторизация | Риск бана |
|---|---|---|---|---|
| Официальный API (OAuth) | всё: посты, комменты, поиск, юзеры | ~100 запр./мин на клиент | нужна | минимальный |
Открытые .json |
посты и комменты одного subreddit | режется, отдаёт 429 | нет | высокий |
| RSS / Atom | около 25 последних постов | явных лимитов нет | нет | низкий |
| Arctic Shift | исторические посты и комменты | щедро | нет | нет |
| Дампы и BigQuery | миллионы записей офлайн | нет | нет | нет |
| HTML старого интерфейса | всё, что видит пользователь | по IP-адресу | нет | высокий |
| Playwright | JS-рендер, бесконечный скролл | по ресурсам | нет | средний |
| Платные скраперы | всё, с прокси и ротацией | по подписке | по тарифу | минимальный |
Ключевой параметр для выбора — не скорость, а доступность исторических данных. Если задача в анализе за последние два года, официальный API вам не поможет: он отдаёт только то, что видно сейчас.
ℹ️ Информация
Самый частый заблуждение: «бесплатный доступ к Reddit API». Его не существует с середины 2023 года. Любой, кто предлагает библиотеку без регистрации приложения, либо использует серый канал, либо упрётся в бан уже после первых тысяч запросов.
Официальный API Reddit
Это единственный метод, который можно назвать гарантированно белым: он описан в документации, имеет формальные лимиты и не приводит к бану аккаунта. Все остальные способы — обходные.
Регистрация приложения
Приложение создаётся в аккаунте Reddit: тип script, redirect URI вида http://localhost:8080. После сохранения выдаются client_id (строка под именем «personal use script») и client_secret рядом со словом secret.
Получение токена
Авторизация кодом начинается с редиректа в браузере пользователя:
GET https://www.reddit.com/api/v1/authorize ?client_id=<ID> &response_type=code &state=<случайная_строка> &scope=identity+read+history+submit+subscribe &redirect_uri=http://localhost:8080
Из адреса редиректа вытаскивается параметр code, который обменивается на токен:
POST https://www.reddit.com/api/v1/access_token Authorization: Basic base64(client_id:client_secret) Content-Type: application/x-www-form-urlencoded grant_type=authorization_code&code=<CODE>&redirect_uri=http://localhost:8080
Обновление токена идёт тем же POST, но с grant_type=refresh_token. Сам access_token живёт час, refresh_token бессрочный. Дальше каждый запрос несёт заголовок Authorization: bearer <TOKEN>.
Базовые эндпоинты
Все они возвращают JSON и используют GET, если не указано иное:
/r/{sub}/hot,/new,/rising— ленты subreddit/r/{sub}/top?t=week— верхние посты за период/r/{sub}/comments/{id}— дерево комментариев к посту/r/{sub}/about— статистика, описание, правила/search?q=текст&restrict_sr=on&sort=new&t=all&type=link— поиск/user/{name}/submittedи/user/{name}/comments— история пользователя/api/v1/me— собственный профиль, используется для проверки токена
Пагинация
Ключевой момент, на котором чаще всего спотыкаются: у Reddit нет параметра page. Ленты меняются так быстро, что нумерация бессмысленна. Вместо неё используется курсор after — полное имя последнего объекта предыдущей страницы, которое возвращается в ответе.
Лимит за один запрос — 100 записей. У постов идентификаторы начинаются с t3_, у комментариев — с t1_, и именно в таком виде их надо передавать обратно.
Библиотеки: PRAW, asyncpraw, pmaw
Ручная работа с OAuth-токеном быстро надоедает. Практически весь код на Python пишется через PRAW — официально рекомендуемую библиотеку.
import praw
reddit = praw.Reddit(
client_id="...",
client_secret="...",
user_agent="my-bot/1.0 by u/myaccount",
)
# верхние посты за неделю
for post in reddit.subreddit("python").top(time_filter="week", limit=100):
print(post.id, post.score, post.title)
# комментарии к посту
submission = reddit.submission(url="https://reddit.com/r/python/comments/xxxxx/...")
submission.comments.replace_more(limit=0)
# поиск
for post in reddit.subreddit("all").search("keyword", sort="new", limit=None):
print(post.title)
Строка replace_more(limit=0) критична: без неё дерево комментариев обрезано примерно на 25 уровнях вложенности, а необработанные ветки лежат в атрибуте MoreComments и просто игнорируются.
Для длительных обходов есть несколько альтернатив:
- asyncpraw — асинхронная версия, заметно быстрее на десятках тысяч записей за счёт отсутствия блокирующего I/O
- pmaw — форк PRAW, который поддерживается активнее оригинала и чинит баги оперативнее
- snoohak — альтернативная библиотека с расширенными возможностями
Отдельный случай — бесконечный итератор по новым постам для лент в реальном времени:
for post in reddit.subreddit("python").stream(limit=None):
if "django" in post.title.lower():
print(post.title)
Быстрые способы: JSON и RSS
Открытые .json
Приём простой: к любому URL страницы дописывается .json и получается JSON-выдача.
curl -A "my-scraper/1.0" \ "https://www.reddit.com/r/python/new.json?limit=100" curl -A "my-scraper/1.0" \ "https://www.reddit.com/r/python/top.json?t=month&limit=100"
Заголовок User-Agent обязателен. С 2023 года анонимные запросы Reddit режет крайне жёстко: 429-ответы, бан по IP, пустые выборки. Метод годится для 5–10 ручных запросов и никаких больше.
RSS
У каждого subreddit есть RSS-лента, отдающая около 25 последних постов:
curl "https://www.reddit.com/r/Python/new/.rss" curl "https://www.reddit.com/r/Python/top/.rss?t=week"
Парсится стандартной библиотекой feedparser, авторизация не нужна, глубокой пагинации нет. Хороший дешёвый вариант для задачи «что нового за последний час».
Архивы: Arctic Shift, Pushshift, дампы
Если задача в анализе истории, а не в мониторинге, live-инструменты не подходят принципиально.
Arctic Shift
Бесплатный архив постов и комментариев, созданный сообществом после закрытия бесплатного Pushshift. Покрытие — с 2022 года.
curl "https://arctic-shift.photon-reddit.com/api/posts/search?subreddit=python&after=1700000000&limit=100" curl "https://arctic-shift.photon-reddit.com/api/comments/search?link_id=t3_xxxxxxx&limit=100"
Поддерживаемые фильтры: subreddit, author, ключевое слово, диапазон времени через after и before, размер выборки. Лимит — 100 записей на запрос, пагинация через курсор link в теле ответа. Комментарии отдаются одним HTTP-вызовом и включают тело поста.
Pushshift
Де-факто стандарт исторических запросов в 2019–2023 годах. После блокировки Reddit API в 2023 году бесплатный эндпоинт api.pushshift.io не работает, проект перешёл на коммерческую модель. Закладываться на него в новом проекте не стоит.
Дампы и BigQuery
Для академических и исследовательских задач существуют статические выгрузки: academictorrents.com и зеркала на файлообменниках. Отдельно стоит Google BigQuery с публичным датасетом Reddit — удобен тем, что запросы идут SQL прямо в облаке, без скачивания терабайтов.
⛔ Предупреждение
Выгрузки на academictorrents и подобных зеркалах — неофициальные и не верифицированные. Для продакшена и публикуемых исследований брать данные только из API или проверенного коммерческого источника.
Скрапинг HTML и Playwright
К этому методу прибегают, когда нужны поля, которых нет в API, — например, вёрстка конкретных страниц рейтинга.
Старый интерфейс
Домен old.reddit.com отдаёт упрощённую HTML-разметку без client-side рендеринга, что радикально упрощает разбору:
import requests
from bs4 import BeautifulSoup
HEADERS = {"User-Agent": "Mozilla/5.0 (Macintosh) my-scraper/1.0"}
r = requests.get(
"https://old.reddit.com/r/python/new/",
headers=HEADERS, timeout=20)
soup = BeautifulSoup(r.text, "lxml")
for thing in soup.select("div.thing"):
print(thing.get("data-permalink"))
Главный селектор — блок div.thing, у которого в атрибуте data-permalink лежит адрес поста. Разметка стабильна уже много лет, что редкость.
Playwright
Когда нужен настоящий браузер: JavaScript-рендер, ленивая подгрузка, бесконечный скролл.
from playwright.sync_api import sync_playwright
with sync_playwright() as p:
browser = p.chromium.launch(headless=True)
page = browser.new_page()
page.goto("https://www.reddit.com/r/python/")
page.mouse.wheel(0, 20000)
page.wait_for_timeout(1500)
html = page.content()
browser.close()
Цена — многократно более высокая нагрузка: своё окружение на каждый прогон, десятки мегабайт трафика на страницу. Для задачи «собрать тысячу постов» это бессмысленно.
Сравнение
Если предыдущая таблица отвечала на вопрос «чем они отличаются», то эта — на вопрос «что выбрать под конкретную задачу».
| Задача | Оптимальный метод | Почему |
|---|---|---|
| Разовый забор постов одного subreddit | .json или RSS |
минимум возни, 5–10 запросов |
| Сбор тысяч постов на Python | PRAW или asyncpraw | OAuth-обход, стабильные лимиты |
| Анализ за месяцы и годы | Arctic Shift | единственный бесплатный исторический API |
| Сложные поля, которых нет в API | old.reddit + BeautifulSoup | простота разметки |
| Лента в реальном времени | PRAW stream или RSS | push вместо polling |
| Продакшн-пайплайн без возни | Apify, ScraperAPI | прокси и ротация из коробки |
| Научный датасет в облаке | BigQuery | SQL без скачивания |
Ограничения и подводные камни
Список того, на чём чаще всего ломается готовый скрипт:
- User-Agent обязателен. Формат, который рекомендует Reddit: описание, версия, имя пользователя — например,
my-scraper/1.0 by u/myaccount - Пагинация только через after. Параметра page не существует, попытки прыгать по страницам бесполезны
- replace_more() в PRAW. Без него дерево комментариев молча обрезается на глудине
- Паузы и рандомизация. Между запросами при массовом обходе нужны задержки, иначе 429
- Бан по IP. За агрессивное поведение блокируют адрес целиком, восстановление идёт через поддержку Reddit и занимает дни
- Кэширование. Лента new неизменна, а hot меняется — стоит сохранять выгрузки локально, чтобы не запрашивать одно и то же дважды
- Экранирование. В JSON-ответах символы
<,>и&приходят уже заменёнными на HTML-сущности; параметрraw_json=1это отключает
FAQ
Можно ли собирать Reddit без регистрации приложения? Технически — да, через RSS и открытые .json. Практически эти методы рассчитаны на единичные запросы: на массовом обходе Reddit отдаёт 429 и банит адрес. Для серьёзной работы приложение регистрируется обязательно.
Какой лимит у официального API? Примерно 100 запросов в минуту на один OAuth-клиент. Лимит считается по client_id, а не по аккаунту, поэтому несколько ключей дают несколько независимых бюджетов. Точные цифры и условия менялись несколько раз с 2023 года — актуальное значение стоит сверять с документацией.
Pushshift можно использовать? Бесплатный api.pushshift.io не работает, сервис коммерциализирован. Замена для исторических запросов — Arctic Shift, у него открытый API и щедрые лимиты.
Что быстрее: PRAW или asyncpraw? На десятках тысяч записей asyncpraw выигрывает кратно за счёт неблокирующего I/O. На сотнях запросов разница несущественна, а код asyncpraw сложнее — с его колбэками легко ошибиться.
Что выбрать для разовой задачи на пару сотен постов? RSS или PRAW. Если subreddit один и нужны только заголовки со ссылками — RSS, это один запрос вместо целого скрипта с OAuth.
Итог
Рабочий выбор выглядит так: свежие посты и комментарии — PRAW с зарегистрированным OAuth-приложением; история за годы — Arctic Shift; разовый мелкий запрос — RSS; продакшн без возни с прокси — Apify или ScraperAPI. HTML-скрапинг и old.reddit стоит оставлять на случай, когда API принципиально не отдаёт нужное поле, а массовый HTML-скрапинг лучше не делать вообще: это одновременно нарушение правил сайта и самый быстрый способ получить бан. Данные в статье проверены 29.09.2026, перед продакшн-развёртыванием стоит перепроверить лимиты и актуальность эндпоинтов.
Источники
- Документация Reddit API
- Условия использования Reddit Data API
- Документация PRAW
- Документация asyncpraw
- PRAW в репозитории PyPI
- asyncpraw в репозитории PyPI
- pmaw в репозитории PyPI
- Arctic Shift — архив постов Reddit
- Pushshift
- Academic Torrents
- Playwright для Python
- Готовые Reddit-скраперы в Apify Store
- ScraperAPI
- Пример RSS-ленты Reddit
