Это вторая часть статьи «Использование API в Python для сбора данных». В этом уроке мы рассмотрим использование пакета PRAW для очистки Reddit и два конкретных варианта использования, полезных для социальных наук и исследований взаимодействия человека с компьютером. Мы рассмотрим основы настройки Python и PRAW для сбора сообщений и комментариев из определенного сабреддита. Затем мы рассмотрим два варианта использования:

  1. Анализ тональности: используется для определения того, насколько положительным или отрицательным является язык в комментарии или публикации на Reddit.
  2. Отслеживание определенных тем. Собрав текстовые данные, вы можете использовать ключевые слова, чтобы увидеть, как различные сообщества обсуждают определенные темы. Например, как сообщество Reddit covid19_support обсуждает психическое здоровье.

Мы выбрали Reddit в качестве образцового сайта социальной сети, так как там огромное количество постов, комментариев и взаимодействий, и все это вполне доступно! Это позволяет социологам и исследователям человеко-компьютерного взаимодействия изучать множество новых онлайн-сообществ, формирующихся онлайн. Давайте узнаем, как получить к нему доступ вместе :D

Отказ от ответственности. Если вы не знакомы с API, как и почему они работают, вы можете прочитать нашу предыдущую статью здесь:



Основы сбора данных с помощью Python PRAW

В этом разделе мы рассмотрим все основные настройки, необходимые для работы PRAW и вашего парсера Reddit.

Мы рассмотрим:

  • Настройка среды разработки
  • Создание приложения Reddit, через которое вы будете запускать своего бота
  • Удаление постов из определенного сабреддита
  • Удаление комментариев из определенного поста

Эти 4 шага дадут вам доступ к тысячам постов из разных сообществ по всему миру. Это формирует основу для более продвинутых вариантов использования, которые мы рассмотрим позже, поэтому будет хорошо сначала разобраться с основами!

Настройка среды

Прежде чем мы начнем, убедитесь, что на вашем компьютере установлен Python. Вы можете скачать Python здесь. Далее нам нужно установить пакет PRAW. Вы можете сделать это, выполнив следующую команду в терминале или командной строке:

pip install praw

Создание приложения Reddit

Чтобы использовать пакет PRAW, вам нужно создать приложение Reddit, чтобы получить необходимые учетные данные. Приложение Reddit — это любая программа, взаимодействующая с Reddit API. Нам нужно зарегистрировать наше приложение в Reddit, чтобы получить разрешение на использование Reddit API, выполнив следующие действия:

  1. Войдите в свою учетную запись Reddit.
  2. Перейдите на страницу Настройки приложения.
  3. Прокрутите вниз до раздела «Разработанные приложения» и нажмите кнопку «Создать приложение» или «Создать другое приложение».
  4. Заполните форму следующим образом:
    * имя: выберите имя для своего приложения.
    * Тип приложения: выберите сценарий.
    * описание: предоставьте краткую информацию. описание вашего приложения (необязательно).
    * URL-адрес о программе: оставьте это поле пустым.
    * URI-адрес перенаправления: введите http://localhost:8080 (без кавычек).
    * разрешения: оставьте выбор по умолчанию.
  5. Нажмите «Создать приложение», чтобы завершить процесс.

После создания приложения вы увидите «идентификатор клиента» и «секрет клиента» на странице приложения. Обратите внимание на эти значения, так как они понадобятся нам в нашем коде.

Сбор данных Reddit с помощью PRAW

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

import praw

#Replace the following placeholders with your Reddit App credentials

client_id = "your_client_id"
client_secret = "your_client_secret"
user_agent = "your_user_agent"
reddit = praw.Reddit(client_id=client_id, client_secret=client_secret, user_agent=user_agent)

Теперь, когда экземпляр Reddit инициализирован, мы можем начать сбор данных. Например, предположим, что мы хотим собрать 10 лучших сообщений из сабреддита AskReddit.

# Collect the top 10 posts of the subreddit

# We start by choosing the subreddit we want to interact with - in this case, it's "AskReddit"
subreddit = reddit.subreddit("AskReddit")

# We then use the "top" method of the "subreddit" object to get the top posts in the subreddit, and limit it to 10 using the "limit" parameter
top_posts = subreddit.top(limit=10)

# We then use a "for" loop to iterate over each post in the "top_posts" list
for post in top_posts:
    # For each post, we print its title using the "title" attribute of the "post" object
    print(post.title)
    
    # We then use another "for" loop to iterate over the comments in the post, limited to the first 10 using the slice notation [:10]
    for comment in post.comments[:10]:
        # For each comment, we print its body using the "body" attribute of the "comment" object
        print(comment.body)

Приведенный выше фрагмент кода обращается к сабреддиту «AskReddit», извлекает 10 лучших сообщений и печатает их заголовки. Вы можете заменить «AskReddit» на любой другой субреддит по вашему выбору.

Сбор комментариев

Теперь предположим, что мы хотим собрать комментарии к каждому из этих сообщений. Мы можем добавить к нашему предыдущему циклу.

# We choose the subreddit we want to interact with
subreddit = reddit.subreddit("AskReddit")

# We get the top 10 posts in the subreddit
top_posts = subreddit.top(limit=10)

# We iterate over each post in the top_posts list
for post in top_posts:
    # We print the title of the post
    print(post.title)
    
    # We iterate over the first 10 comments in the post
    for comment in post.comments[:10]:
        # We print the body of the comment
        print(comment.body)

Замените «your_post_id» на идентификатор поста, из которого вы хотите извлечь комментарии. Приведенный выше фрагмент кода извлекает все комментарии из указанного сообщения и печатает их содержимое.

Собираем все вместе

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

import praw
import csv

# Create a Reddit instance with your authentication credentials
reddit = praw.Reddit(client_id='YOUR_CLIENT_ID', client_secret='YOUR_CLIENT_SECRET', user_agent='YOUR_USER_AGENT')

# Choose the subreddit you want to interact with
subreddit = reddit.subreddit("AskReddit")

# Get the top 10 posts in the subreddit
top_posts = subreddit.top(limit=10)

# Create a new CSV file to write the data to
with open("reddit_data.csv", mode="w", newline='', encoding='utf-8') as file:
    writer = csv.writer(file)
    writer.writerow(["Post Title", "Comment Body"])

    # Iterate over each post in the top_posts list
    for post in top_posts:
        # Get the title of the post
        post_title = post.title

        # Iterate over the first 10 comments in the post
        for comment in post.comments[:10]:
            # Get the body of the comment
            comment_body = comment.body

            # Write the post title and comment body to the CSV file
            writer.writerow([post_title, comment_body])

После этого у вас будет CSV-файл, заполненный комментариями, которые можно проанализировать для решения различных исследовательских вопросов.

Расширенные инструменты

Скорее всего, у вас есть более интересный вопрос, чем «Какие 10 самых популярных сообщений в r/askreddit?» Чтобы ответить на более точные вопросы, нам потребуются более конкретные данные. Давайте рассмотрим два способа сбора более интересных данных:

  1. Анализ настроений
  2. Идентификация ключевого слова

Анализ настроений в сабреддите

Как социолог, вам может быть интересно понять общее настроение субреддита. Например, вы можете изучить настроение сообщений в сабреддите «r/COVID19_support», чтобы увидеть, как люди справляются с пандемией.

Настраивать

Давайте начнем с установки некоторых новых пакетов, которые помогут нам в анализе настроений.

pip install textblob
pip install nltk

Затем мы загрузим данные, необходимые для анализа настроений.

import nltk
nltk.download('punkt')
nltk.download('averaged_perceptron_tagger')
nltk.download('corpora')

Затем мы настроим PRAW на просмотр сабреддита r/COVID19_support и сбор 100 лучших сообщений.

# Inital setup of PRAW package to gather from the COVID19_support subreddit
import praw
from praw.models import MoreComments

# Create a Reddit instance with your authentication credentials
reddit = praw.Reddit(client_id='YOUR_CLIENT_ID', client_secret='YOUR_CLIENT_SECRET', user_agent='YOUR_USER_AGENT')

# Choose the subreddit you want to interact with
subreddit = reddit.subreddit("COVID19_support")

limit = 100
posts = subreddit.top(limit=limit)

Собирать текстовые данные из постов

Далее мы будем использовать наш процесс сбора комментариев ранее, чтобы получить корпус комментариев. Мы будем использовать словари данных для организации наших данных. Если вы не знакомы с ними, сообщите нам об этом в комментариях, и мы опубликуем следующий пост о распространенных типах данных в Python :D

# Create an empty list to store the data dictionaries
data = []

# Iterate over each post in the top_posts list
for post in top_posts:
    # Get the title of the post
    post_title = post.title

    # Iterate over the first 10 comments in the post
    for comment in post.comments[:10]:
        # Get the body of the comment
        comment_body = comment.body

        # Get the number of upvotes for the comment
        upvotes = comment.score

        # Create a data dictionary with the post title, comment body, number of upvotes, and sentiment analysis score
        data_dict = {
            "Post Title": post_title,
            "Comment Body": comment_body,
            "Upvotes": upvotes,
        }

        # Append the data dictionary to the list
        data.append(data_dict)

# Print the data list to verify that it worked
print(data)

Теперь у нас есть код, который собирает 100 лучших сообщений из сабреддита r/covid19_support и 10 лучших комментариев к сообщению. Для каждого комментария мы также получаем текст и количество голосов.

Выполните анализ настроений по собранным данным

Наконец, мы добавим часть анализа настроений. Это действительно небольшое изменение в существующем коде. Нам нужна только эта строка

sentiment_score = TextBlob(comment_body).sentiment.polarity

Это дает нам положительное число, если язык, использованный в комментарии, был положительным, и отрицательное значение, если язык был отрицательным.

С помощью анализа настроений мы можем быстро получить представление о том, как сообщество рассматривает определенные темы или использует ли человек эмоционально заряженный язык при общении в Интернете.

Собираем все вместе

Вот код, собранный воедино. Сначала он создает экземпляр Reddit с PRAW, затем выбирает сабреддит, захватывает 100 лучших сообщений и собирает 10 лучших комментариев, их текст, количество голосов и их настроение.

import praw
from textblob import TextBlob

# Create a Reddit instance with your authentication credentials
reddit = praw.Reddit(client_id='YOUR_CLIENT_ID', client_secret='YOUR_CLIENT_SECRET', user_agent='YOUR_USER_AGENT')

# Choose the subreddit you want to interact with
subreddit = reddit.subreddit("Covid19_support")

# Get the top 10 posts in the subreddit
top_posts = subreddit.top(limit=100)

# Create an empty list to store the data dictionaries
data = []

# Iterate over each post in the top_posts list
for post in top_posts:
    # Get the title of the post
    post_title = post.title

    # Iterate over the first 10 comments in the post
    for comment in post.comments[:10]:
        # Get the body of the comment
        comment_body = comment.body

        # Get the number of upvotes for the comment
        upvotes = comment.score

        # Perform sentiment analysis on the comment using TextBlob
        sentiment_score = TextBlob(comment_body).sentiment.polarity

        # Create a data dictionary with the post title, comment body, number of upvotes, and sentiment analysis score
        data_dict = {
            "Post Title": post_title,
            "Comment Body": comment_body,
            "Upvotes": upvotes,
            "Sentiment Score": sentiment_score
        }

        # Append the data dictionary to the list
        data.append(data_dict)

# Print the data list to verify that it worked
print(data)

Отслеживание обсуждений на определенные темы

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

import praw
import csv
from textblob import TextBlob

# Create a Reddit instance with your authentication credentials
reddit = praw.Reddit(client_id='YOUR_CLIENT_ID', client_secret='YOUR_CLIENT_SECRET', user_agent='YOUR_USER_AGENT')

# Create a list of subreddits to collect data from
subreddits = ["conservative", "liberal"]

# Define the keywords to search for in the comments
keywords = ["mental health", "depression", "anxiety"]

# Create an empty list to store the data dictionaries
data = []

# Iterate over each subreddit in the subreddits list
for subreddit_name in subreddits:
    # Choose the subreddit you want to interact with
    subreddit = reddit.subreddit(subreddit_name)

    # Get the top 100 posts in the subreddit
    top_posts = subreddit.top(limit=100)

    # Iterate over each post in the top_posts list
    for post in top_posts:
        # Get the title of the post
        post_title = post.title

        # Iterate over the first 10 comments in the post
        for comment in post.comments[:10]:
            # Get the body of the comment
            comment_body = comment.body

            # Check if any of the keywords are in the comment
            if any(keyword in comment_body.lower() for keyword in keywords):
                # Get the number of upvotes for the comment
                upvotes = comment.score

                # Perform sentiment analysis on the comment using TextBlob
                sentiment_score = TextBlob(comment_body).sentiment.polarity

                # Create a data dictionary with the post title, comment body, number of upvotes, and sentiment analysis score
                data_dict = {
                    "Subreddit": subreddit_name,
                    "Post Title": post_title,
                    "Comment Body": comment_body,
                    "Upvotes": upvotes,
                    "Sentiment Score": sentiment_score
                }

                # Append the data dictionary to the list
                data.append(data_dict)

# Save the data as a CSV file
with open('mental_health_comments.csv', mode='w', newline='', encoding='utf-8') as csv_file:
    fieldnames = ["Subreddit", "Post Title", "Comment Body", "Upvotes", "Sentiment Score"]
    writer = csv.DictWriter(csv_file, fieldnames=fieldnames)
    writer.writeheader()
    for d in data:
        writer.writerow(d)

Этот код Python собирает данные из двух политических субреддитов — «консервативного» и «либерального» — на Reddit путем поиска комментариев, содержащих определенные ключевые слова, связанные с психическим здоровьем. В частности, он ищет слова «психическое здоровье», «депрессия» и «тревога».

Для каждого подходящего комментария, найденного в 100 лучших сообщениях каждого сабреддита, код записывает заголовок сообщения, текст комментария, количество голосов и оценку анализа настроений с использованием библиотеки TextBlob.

Полученные данные сохраняются в списке словарей, называемых «данными», где каждый словарь содержит информацию об одном определяющем комментарии. Список «данных» может быть экспортирован в электронную таблицу для дальнейшего анализа социологами или исследователями, заинтересованными в изучении связи между политической идеологией и отношением к психическому здоровью.

Заключение

С помощью этих скриптов мы можем создать корпус из 1000 комментариев из субреддита по нашему выбору и проанализировать их настроение за считанные минуты.

Все эти данные имеют множество потенциальных применений. Вот три варианта использования, чтобы пробудить ваше воображение:

  1. Изучение общественного мнения по политическим вопросам. Анализируя настроения в комментариях к политическим субреддитам, исследователи могут получить представление об общественном мнении по определенным вопросам и отслеживать изменения во мнении с течением времени.
  2. Изучение вовлеченности на онлайн-платформах. Анализ взаимосвязи между настроениями и вовлеченностью (измеряемой количеством голосов) может помочь исследователям понять, какие факторы способствуют вовлечению в онлайн-дискуссии.
  3. Выявление шаблонов в обсуждениях психического здоровья. Исследователи могут анализировать язык, используемый в комментариях к субреддитам, связанным с психическим здоровьем, чтобы выявить общие темы и шаблоны в том, как люди говорят о проблемах психического здоровья.

Это всего лишь несколько идей. Я хотел бы услышать, что вы все имеете в виду!

Если у вас есть другие идеи о том, что мы могли бы добавить в Academic’s Toolkit, сообщите нам об этом. На создание этого поста меня вдохновил комментарий ХенниДжи Вичерс к нашему первому посту.



Ваше здоровье,

Натан Лаундри из Лаборатории интеллектуальных адаптивных вмешательств в UofT

Отредактировал: Хёна Чо

✉️ Подпишитесь на мою электронную рассылку #GuidingQuestions здесь