Reddit - методы сбора данных - 2026

Материал из Wiki - Iphoster - the best ever hosting and support. 2005 - 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, перед продакшн-развёртыванием стоит перепроверить лимиты и актуальность эндпоинтов.

Источники

×
Реклама
← В главную
ИКС 88x31 - Visitor counter