Простое руководство по сбору данных с помощью Reddit API
Reddit - это огромная экосистема, наполненная данными, которые всегда под рукой. Как человек, ориентированный на данные, я хотел воспользоваться этим и провести некоторый анализ, используя это обширное хранилище данных с открытым исходным кодом.
Первоначально выяснилось, что освоение API Reddit не было таким однозначным, как ожидалось, несмотря на то, что это был простой процесс; поначалу это может немного сбивать с толку.
Итак, разобравшись во всем, я написал эту статью, которая, надеюсь, поможет некоторым из вас познакомиться с использованием Reddit API в Python. Мы покроем:
> Getting Access > Making Requests - Reading the Data - Streaming New Posts > Parameters
Если вы предпочитаете видео, я также расскажу обо всем из этой статьи:
Получение доступа
Во-первых, нам нужен доступ. В отличие от большинства популярных сервисов, Reddit API изначально было довольно сложно разобраться. Есть несколько шагов:
1. Перейдите в Настройки приложения и нажмите внизу создать другое приложение….
2. Заполните необходимые данные, обязательно выберите сценарий - и нажмите создать приложение.

3. Запишите токены сценария личного использования и секрет:

4. Запросите у Reddit временный токен OAuth. Для этого нам понадобятся наши логин и пароль:
5. Добавляйте headers=headers к каждому запросу. Срок действия токена OAuth истечет примерно через 2 часа, и необходимо будет запросить новый.
Делать запросы
Теперь у нас все настроено - можно начинать делать запросы. Если мы хотим начать извлекать данные Reddit, нашей первой остановкой могло бы стать чтение самых популярных постов в выбранных нами сабреддитах.
Начнем с / r / Python. Мы можем получить самые популярные сообщения с помощью GET /r/subreddit/hot следующим образом:

Мы возвращаем много данных, поэтому давайте отфильтруем что-нибудь более читабельное. К каждому сообщению можно получить доступ, просматривая каждый элемент в res.json()['data']['children'].
Чтение данных
Заголовок каждого сообщения хранится в 'title', элементе 'data' словаря, поэтому мы печатаем заголовок каждого сообщения следующим образом:

Мы можем использовать тот же подход для создания фрейма данных, содержащего основную информацию о публикации. В частности, может быть полезно вытащить заголовок, дату и время, контент и реакцию на сообщение.

Потоковая передача новых сообщений
Мы можем очень немного изменить наш код, чтобы вместо этого возвращать все самые последние сообщения. Предоставление нам потока сообщений, сделанных в режиме реального времени.
Если мы посмотрим на документацию по API здесь, то увидим, что GET /r/subreddit/new она предоставляет нам необходимую функциональность. Все, что нам нужно сделать, это изменить наш запрос на получение с /r/python/hot на /r/python/new:
И с этим мы создали два метода для очистки данных из любого субреддита - и мы можем использовать практически тот же код и для любого другого метода!
Параметры
Но это еще не все. Есть несколько параметров, которые мы можем добавить к нашим запросам. Наиболее актуальными для парсинга данных являются:
limit- максимальное количество возвращаемых товаров.- _10 _ / _ 11_ - используется для указания, что мы хотим искать только сообщения, которые
beforeилиafterдругие.
Предел
Параметр limit не требует пояснений. Мы передаем число, чтобы указать, что мы хотели бы получать не более указанного количества товаров.
Где применимо, limit по умолчанию установлено на 25. Мы можем накачать это максимальное значение в 100 предметов.
До или после
Далее идут параметры before и after. Оба они работают одинаково - мы передаем полное имя сообщения, а затем API извлекает элементы, которые находятся до или после этого сообщения.

Как ни странно, after означает «дальше назад во времени», тогда как before означает «совсем недавно». Итак, если мы возьмем пункт t3_k3vndz на 13:21:
beforeдает намt3_k3vsriв 13:30.afterдает намt3_k3usnaв 12:21.
Все, что нам сейчас нужно, это найти полное название наших предметов. Вернемся к документации Reddit API, этот раздел объясняет, что именно нам нужно.

Сначала нам нужно определить, с каким типом предметов мы работаем. В нашем примере мы извлекали сообщения в сабреддите / r / Python. Эти сообщения классифицируются как ссылки - поскольку они фактически ссылаются на саму публикацию.
Вместо того, чтобы гадать, какой тип элемента мы возвращаем из API, мы просто проверяем. Тип наших возвращенных сообщений указан в ключе items 'kind':

Точно так же идентификатор указывается и в нашем ответе. В data словаре у нас есть 'id' ключ. Мы объединяем эти две части вместе, чтобы создать полное имя:

Теперь, когда у нас есть метод построения полных имен, мы можем улучшить сбор данных, чтобы путешествовать дальше во времени.
Для этого мы:
- Запросите 100 новейших сообщений, сохранив ответ в
df. - Получите
fullnameсамого старого сообщения вdf. - Запросите 100 сообщений, которые были опубликованы
afterнашfullname. - Добавляйте наши новые сообщения в
df. - Повторяйте шаги 2–4, пока не получите желаемый результат!
Благодаря этому мы создали инструмент для извлечения огромных объемов невероятно ценных данных из Reddit. Полный скрипт для этого инструмента находится здесь:
После того, как мы настроили аутентификацию API и сделали несколько запросов, становится намного проще понять, как взаимодействовать с API.
Документация Reddit API проста, поэтому ее очень легко понять - я определенно рекомендую прокрутить ее, чтобы увидеть, что с ней можно сделать.
Альтернативой является использование библиотеки Python PRAW - специальной библиотеки для взаимодействия с Reddit API. Если вам не очень нравится requests или вы просто цените добавленный уровень абстракции, попробуйте его!
Это все, что касается введения в использование Reddit API в Python! Надеюсь, это было полезно - если у вас есть вопросы или отзывы, дайте мне знать через Twitter или в комментариях ниже.
Спасибо за прочтение!