Парсинг Reddit с помощью PRAW (Python Reddit API Wrapper)
В этой статье мы рассмотрим, как парсить Reddit с помощью Python. Мы будем использовать PRAW (Python Reddit API Wrapper) для сбора данных.
Почему PRAW?
Хотя существуют и другие способы парсинга данных с Reddit, PRAW делает это очень просто. Он следует всем правилам API Reddit и позволяет избежать необходимости включать задержки в вашем коде. Прежде чем мы начнем писать код, нам нужно настроить аутентификацию.
Аутентификация
Для работы с PRAW требуется аутентификация. Перейдите по этой ссылке, чтобы перейти на страницу разработчика Reddit. Зарегистрируйтесь, чтобы создать новую учетную запись, или войдите, если у вас уже есть учетная запись.
После входа в систему убедитесь, что вы находитесь на вкладке "apps" - внизу страницы должна быть кнопка "are you a developer? create an app...". См. изображения ниже:
После нажатия кнопки должна появиться форма с названием "create application". Вам нужно заполнить форму и нажать кнопку "create app". См. пример ниже:
Теперь вы должны увидеть свое новое приложение, которое содержит всю необходимую информацию, как показано ниже (в изображении ниже ключи заменены текстом из соображений безопасности):
Теперь, когда у вас настроена аутентификация, мы можем начать писать код.
Давайте напишем немного кода
Как я уже упоминал, мы будем использовать пакет Python под названием PRAW. Он очень хорошо задокументирован, и вы всегда можете задавать вопросы в их канале Slack.
Документация PRAW: PRAW Doc PRAW поддерживается в Python 3.6+ Репозиторий PRAW: PRAW Канал Slack PRAW: SLACK
Нашей целью для этого примера является сбор информации о 50 постах о Bitcoin в субреддите CryptoCurrency, а именно: заголовок, рейтинг, количество комментариев, дата и ссылка на URL. В конечном итоге мы сгенерируем файлы .json и .csv на основе этих данных.
Откройте терминал и перейдите в каталог, в котором вы хотите сохранить свою работу.
cd <название_рабочего_каталога>
Теперь создайте новый каталог, в котором будут храниться все файлы, связанные с парсингом.
mkdir reddit-parse
Перейдите в созданный каталог.
cd reddit-parse
Создайте файл .py.
touch r_parse.py
Установите PRAW.
pip install praw
Установите pandas.
pip install pandas
Pandas - это библиотека Python, используемая для манипулирования и анализа данных. Документация Pandas: Pandas Doc Репозиторий Pandas: Pandas Repo
Откройте файл r_parse.py.
Сначала импортируйте необходимые модули.
import praw
import pandas as pd
import json
Python поддерживает работу с json изначально.
Создайте экземпляр Reddit только для чтения, используя информацию из вашего разработанного приложения.
r = praw.Reddit(client_id="<ВАШ_ID_КЛИЕНТА>", client_secret="<ВАШ_СЕКРЕТ_КЛИЕНТА>", user_agent="<ВАШ_ПОЛЬЗОВАТЕЛЬСКИЙ_АГЕНТ>")
Замените пометки
<...>
фактической информацией. Рекомендуемый формат для user_agent выглядит так:<платформа>:<ID_приложения>:<версия> (от u/<имя_пользователя_Reddit>)
Из документации PRAW: Client ID и Client Secret Эти два значения необходимы для доступа к API Reddit в качестве приложения script (см. Аутентификация через OAuth для других типов приложений). Если у вас еще нет идентификатора клиента и секретного ключа клиента, следуйте Руководству по первым шагам Reddit для их создания. User Agent User Agent - это уникальный идентификатор, который помогает Reddit определить источник сетевых запросов. Чтобы использовать API Reddit, вам нужен уникальный и описательный User Agent. Рекомендуемый формат выглядит так:<платформа>:<ID_приложения>:<версия> (от u/<имя_пользователя_Reddit>)
. Например,android:com.example.myredditapp:v1.2.3 (от u/kemitche)
. Подробнее о User Agent можно прочитать на странице вики API Reddit.
Установите параметры поиска.
q = 'bitcoin' # запрос
sub = 'CryptoCurrency' # субреддит
sort = "top" # сортировка
limit = 50 # лимит
Несколько субреддитов могут быть объединены с помощью +. Например: sub='CryptoCurrency+SatoshiStreetBets'
Создайте поиск в субреддите.
top_posts = r.subreddit(sub).search(q, sort=sort, limit=limit)
Инициализируйте пустой список.
total_posts = list()
Переберите top_posts, и для каждого экземпляра создайте словарь для хранения собранных данных в упорядоченной коллекции. Кроме того, для каждого экземпляра добавьте вновь созданный словарь в пустой список.
for post in top_posts:
# print(vars(post)) # вывести все свойства
Title = post.title
Score = post.score
Number_Of_Comments = post.num_comments
Publish_Date = post.created
Link = post.permalink
data_set = {
"Title": Title[0],
"Score": Score[0],
"Number_Of_Comments": Number_Of_Comments[0],
"Publish_Date": Publish_Date[0],
"Link": 'https://www.reddit.com' + Link[0]
}
total_posts.append(data_set)
Вы можете раскомментировать print(vars(post)), чтобы увидеть все данные, к которым у вас есть доступ для каждого поста. Причина добавления предустановленного значения к Link заключается в том, что мы получаем постоянную ссылку на пост, и добавляя 'https://www.reddit.com' перед ней, мы получаем доступ к URL-адресу поста.
Создайте файл csv.
# создать файл csv
df = pd.DataFrame(total_posts)
df.to_csv('data.csv', sep=',', index=False)
Создайте файл json.
# создать файл json
json_string = json.dumps(total_posts)
jsonFile = open("data.json", "w")
jsonFile.write(json_string)
jsonFile.close()
Полный код:
Смотрите репозиторий этого кода: GitHub
import praw
import pandas as pd
import json
r = praw.Reddit(client_id="<ВАШ_ID_КЛИЕНТА>", client_secret="<ВАШ_СЕКРЕТ_КЛИЕНТА>", user_agent="<ВАШ_ПОЛЬЗОВАТЕЛЬСКИЙ_АГЕНТ>")
q = 'bitcoin'
sub = 'CryptoCurrency'
sort = "top"
limit = 50
top_posts = r.subreddit(sub).search(q, sort=sort, limit=limit)
total_posts = list()
for post in top_posts:
# print(vars(post)) # вывести все свойства
Title = post.title
Score = post.score
Number_Of_Comments = post.num_comments
Publish_Date = post.created
Link = post.permalink
data_set = {
"Title": Title[0],
"Score": Score[0],
"Number_Of_Comments": Number_Of_Comments[0],
"Publish_Date": Publish_Date[0],
"Link": 'https://www.reddit.com' + Link[0]
}
total_posts.append(data_set)
# создать файл csv
df = pd.DataFrame(total_posts)
df.to_csv('data.csv', sep=',', index=False)
# создать файл json
json_string = json.dumps(total_posts)
jsonFile = open("data.json", "w")
jsonFile.write(json_string)
jsonFile.close()
Мы можем запустить вышеуказанный код с помощью следующей команды:
python r_parse.py
После запуска кода в нашем каталоге reddit-parse будет создан файл data.csv и data.json, и внутри файлов мы должны увидеть собранные данные, как показано ниже:
Надеюсь, вам понравилось прочитать это и что это помогло вам понять основы использования PRAW. Это всего лишь малая часть того, что вы можете сделать с помощью PRAW. Я настоятельно рекомендую изучить их документацию и начать пробовать сами. До следующего раза!