CoderCastrov logo
CoderCastrov
Парсер

Парсинг Reddit с помощью PRAW (Python Reddit API Wrapper)

Парсинг Reddit с помощью PRAW (Python Reddit API Wrapper)
просмотров
5 мин чтение
#Парсер
Poster showing Reddit logo

В этой статье мы рассмотрим, как парсить Reddit с помощью Python. Мы будем использовать PRAW (Python Reddit API Wrapper) для сбора данных.

Почему PRAW?

Хотя существуют и другие способы парсинга данных с Reddit, PRAW делает это очень просто. Он следует всем правилам API Reddit и позволяет избежать необходимости включать задержки в вашем коде. Прежде чем мы начнем писать код, нам нужно настроить аутентификацию.

Аутентификация

Для работы с PRAW требуется аутентификация. Перейдите по этой ссылке, чтобы перейти на страницу разработчика Reddit. Зарегистрируйтесь, чтобы создать новую учетную запись, или войдите, если у вас уже есть учетная запись.

После входа в систему убедитесь, что вы находитесь на вкладке "apps" - внизу страницы должна быть кнопка "are you a developer? create an app...". См. изображения ниже:

Image showing a snip from Reddit's applications website Image showing a snip from Reddit's applications website

После нажатия кнопки должна появиться форма с названием "create application". Вам нужно заполнить форму и нажать кнопку "create app". См. пример ниже:

Image showing a form

Теперь вы должны увидеть свое новое приложение, которое содержит всю необходимую информацию, как показано ниже (в изображении ниже ключи заменены текстом из соображений безопасности):

Image showing developed application information

Теперь, когда у вас настроена аутентификация, мы можем начать писать код.

Давайте напишем немного кода

Как я уже упоминал, мы будем использовать пакет 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, и внутри файлов мы должны увидеть собранные данные, как показано ниже:

Image showing a snip of the data in data.csv Image showing a snip of the data in data.json

Надеюсь, вам понравилось прочитать это и что это помогло вам понять основы использования PRAW. Это всего лишь малая часть того, что вы можете сделать с помощью PRAW. Я настоятельно рекомендую изучить их документацию и начать пробовать сами. До следующего раза!