Это вторая часть статьи «Использование API в Python для сбора данных». В этом уроке мы рассмотрим использование пакета PRAW для очистки Reddit и два конкретных варианта использования, полезных для социальных наук и исследований взаимодействия человека с компьютером. Мы рассмотрим основы настройки Python и PRAW для сбора сообщений и комментариев из определенного сабреддита. Затем мы рассмотрим два варианта использования:
- Анализ тональности: используется для определения того, насколько положительным или отрицательным является язык в комментарии или публикации на Reddit.
- Отслеживание определенных тем. Собрав текстовые данные, вы можете использовать ключевые слова, чтобы увидеть, как различные сообщества обсуждают определенные темы. Например, как сообщество 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, выполнив следующие действия:
- Войдите в свою учетную запись Reddit.
- Перейдите на страницу Настройки приложения.
- Прокрутите вниз до раздела «Разработанные приложения» и нажмите кнопку «Создать приложение» или «Создать другое приложение».
- Заполните форму следующим образом:
* имя: выберите имя для своего приложения.
* Тип приложения: выберите сценарий.
* описание: предоставьте краткую информацию. описание вашего приложения (необязательно).
* URL-адрес о программе: оставьте это поле пустым.
* URI-адрес перенаправления: введите http://localhost:8080 (без кавычек).
* разрешения: оставьте выбор по умолчанию. - Нажмите «Создать приложение», чтобы завершить процесс.
После создания приложения вы увидите «идентификатор клиента» и «секрет клиента» на странице приложения. Обратите внимание на эти значения, так как они понадобятся нам в нашем коде.
Сбор данных 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?» Чтобы ответить на более точные вопросы, нам потребуются более конкретные данные. Давайте рассмотрим два способа сбора более интересных данных:
- Анализ настроений
- Идентификация ключевого слова
Анализ настроений в сабреддите
Как социолог, вам может быть интересно понять общее настроение субреддита. Например, вы можете изучить настроение сообщений в сабреддите «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 комментариев из субреддита по нашему выбору и проанализировать их настроение за считанные минуты.
Все эти данные имеют множество потенциальных применений. Вот три варианта использования, чтобы пробудить ваше воображение:
- Изучение общественного мнения по политическим вопросам. Анализируя настроения в комментариях к политическим субреддитам, исследователи могут получить представление об общественном мнении по определенным вопросам и отслеживать изменения во мнении с течением времени.
- Изучение вовлеченности на онлайн-платформах. Анализ взаимосвязи между настроениями и вовлеченностью (измеряемой количеством голосов) может помочь исследователям понять, какие факторы способствуют вовлечению в онлайн-дискуссии.
- Выявление шаблонов в обсуждениях психического здоровья. Исследователи могут анализировать язык, используемый в комментариях к субреддитам, связанным с психическим здоровьем, чтобы выявить общие темы и шаблоны в том, как люди говорят о проблемах психического здоровья.
Это всего лишь несколько идей. Я хотел бы услышать, что вы все имеете в виду!
Если у вас есть другие идеи о том, что мы могли бы добавить в Academic’s Toolkit, сообщите нам об этом. На создание этого поста меня вдохновил комментарий ХенниДжи Вичерс к нашему первому посту.
Добро пожаловать в Полевое руководство по написанию кода для академических кругов
«Натан, я компьютерный ученый, а не инженер-программист — реплика одного из моих любимых профессоров, когда я жареный…medium.com»
Ваше здоровье,
Натан Лаундри из Лаборатории интеллектуальных адаптивных вмешательств в UofT
Отредактировал: Хёна Чо
✉️ Подпишитесь на мою электронную рассылку #GuidingQuestions здесь