CoderCastrov logo
CoderCastrov
Твиттер

Как получить больше информации из твитов на Twitter

Как получить больше информации из твитов на Twitter
просмотров
20 мин чтение
#Твиттер
Table Of Content

Подробное руководство по парсингу Twitter

Обзор

Иногда простой парсинг текста и использование простых запросов на твиты недостаточно. После получения достаточного количества запросов по вопросам, которые не были полностью рассмотрены в моей статье о базовом парсинге Twitter, я решил написать статью-продолжение, которая объясняет множество атрибутов и методов, предлагаемых Tweepy и GetOldTweets3, для дальнейшего уточнения запросов на твиты. Надеюсь, что эта статья ответит на все оставшиеся вопросы или даст новые идеи. Как и в предыдущей статье, я буду использовать Tweepy, библиотеку на языке Python для доступа к API Twitter, и GetOldTweets3 от Дмитрия Моттла, библиотеку на языке Python для парсинга данных без необходимости в API-ключах.

Это руководство предназначено для прямолинейной статьи, которая сразу переходит к кодированию, демонстрируя доступные данные в различных объектах из каждой библиотеки и методы для дальнейшего уточнения запроса при парсинге твитов.

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

Перед продолжением/ Предварительные требования

В этой статье предполагается, что у вас есть знакомство с Python и либо Tweepy, либо GetOldTweets3. Если это ваш первый опыт скрапинга с использованием этих библиотек или вам нужно освежить память, я рекомендую прочитать мою предыдущую статью, которая охватывает основы и настройку.

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

Tweepy:

  • Может взаимодействовать с API Twitter и создавать твиты, добавлять в избранное и т. д.
  • Требуется регистрация для получения учетных данных
  • Доступ к более подробной информации о твите и пользователе
  • Есть ограничения в отношении скрапинга большого количества твитов и доступа к твитам, старше недели, с использованием стандартного поискового API

GetOldTweets3

_ОБНОВЛЕНИЕ: ИЗ-ЗА ИЗМЕНЕНИЙ В API TWITTER GETOLDTWEETS3 БОЛЬШЕ НЕ РАБОТАЕТ. SNSCRAPE СТАЛ ЗАМЕНОЙ БЕСПЛАТНОЙ БИБЛИОТЕКОЙ, КОТОРУЮ ВЫ МОЖЕТЕ ИСПОЛЬЗОВАТЬ ДЛЯ СКРАПИНГА ВНЕ ОГРАНИЧЕНИЙ БЕСПЛАТНОЙ ВЕРСИИ TWEEPY. МОЯ СТАТЬЯ ДОСТУПНА ЗДЕСЬ ДЛЯ _SNSCRAPE.

  • Используется только для скрапинга твитов
  • Не требуется регистрация
  • Ограниченный доступ к информации о пользователе
  • Нет ограничений для скрапинга большого количества твитов или доступа к старым твитам

Это основные характеристики двух библиотек, более подробное сравнение я привожу в своей предыдущей статье, если вас это интересует. Если вы хотите получить доступ к информации Tweepy о большом объеме данных, я рекомендую изучить премиум/предприятийные поисковые API Twitter. В этой статье отлично показана библиотека под названием searchtweets, которая позволяет использовать эти API с помощью Python. Если вы считаете премиум/предприятийные API Twitter слишком дорогими, есть обходной путь, при котором вы можете использовать Tweepy и GetOldTweets3 вместе, о котором я расскажу в конце этой статьи.

Эта статья охватывает различные тематические ниши, и поэтому я не рекомендую читать ее от начала до конца, если вам необходимо полное понимание Tweepy и GetOldTweets3. Поэтому я включу связанное оглавление, чтобы вы могли решить, какая информация вам интересна, и перейти к соответствующему разделу. Кроме того, как вы увидите, большинство моих функций настроены на скрапинг 150 твитов. Я рекомендую сначала протестировать свои запросы на небольших выборках, а затем скрапить нужное количество твитов, так как большие запросы могут занимать время для завершения.

Краткое замечание: если вы скрапите приватные аккаунты или ранее приватные аккаунты, вы можете обнаружить, что не можете получить доступ к твитам или можете быть ограничены в количестве твитов, которые вы можете скрэпить.

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

Без лишних слов давайте приступим к скрапингу!

Содержание:

Парсинг с помощью Tweepy

Парсинг с помощью GetOldTweets3

Как использовать Tweepy с GetOldTweets3


Скрапинг большего количества данных с помощью Tweepy

Если вам нужен код для следования за этим разделом, у меня есть статья Jupyter Notebook здесь. Если вам нужны больше примеров кода и простые в использовании функции, я создал сопутствующий Jupyter Notebook здесь.

Начало работы

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

consumer_key = "XXXXX"
consumer_secret = "XXXXX"
access_token = "XXXXX"
access_token_secret = "XXXXXX"auth = tweepy.OAuthHandler(consumer_key, consumer_secret)
auth.set_access_token(access_token, access_token_secret)
api = tweepy.API(auth,wait_on_rate_limit=True)

Получение дополнительной информации из твитов

Изображение, предоставленное ниже, хотя и не является исчерпывающим списком, охватывает большую часть информации, доступной в объекте твита Tweepy. Если вас интересует, какие еще данные доступны, полный список информации показан здесь на сайте разработчика Twitter. Как вы увидите в этом разделе и в разделе с информацией о пользователе, я использую строковые версии идентификаторов вместо целочисленных, чтобы сохранить целостность данных, поскольку сохранение целочисленного значения может привести к потере данных при последующем доступе к нему.

Список доступной информации о твите с помощью Tweepy

В большинстве случаев у каждого атрибута твита будет какое-то значение и они легко доступны. Однако атрибуты tweet.coordinates и tweet.place требуют некоторого извлечения, потому что они являются словарями данных, содержащими другие данные. Кроме того, поскольку они могут быть пустыми, важно сначала проверить, есть ли вообще информация в твите. Ниже приведены функции, которые проверяют, есть ли у атрибута данные, и извлекают соответствующую информацию. Этот код предполагает, что вы следуете моей системе именования столбцов, как мы увидим в следующем разделе. Если вы измените способ названия Tweet Coordinates или Place Info, вам нужно будет соответствующим образом изменить код ниже.

# Функция, созданная для извлечения координат из твита, если у него есть информация о координатах
# Твиты обычно содержат значение null, поэтому важно выполнить проверку
# Убедитесь, что вы запускаете эту ячейку, поскольку она используется во многих разных функциях ниже
def extract_coordinates(row):
    if row['Tweet Coordinates']:
        return row['Tweet Coordinates']['coordinates']
    else:
        return None

# Функция, созданная для извлечения места, такого как город, штат или страна, из твита, если у него есть информация о месте
# Твиты обычно содержат значение null, поэтому важно выполнить проверку
# Убедитесь, что вы запускаете эту ячейку, поскольку она используется во многих разных функциях ниже
def extract_place(row):
    if row['Place Info']:
        return row['Place Info'].full_name
    else:
        return None

Теперь, когда мы можем извлекать полезную информацию из атрибутов tweet.coordinates и tweet.place, давайте перейдем к фактическому парсингу.

Пример запроса поиска, извлекающего всю доступную информацию о твите из твитов пользователя:

username = 'random'
max_tweets = 150
 
tweets = tweepy.Cursor(api.user_timeline,id=username).items(max_tweets)
 
# Извлечение информации из объекта итерируемых твитов
# Добавьте или удалите информацию о твите, которую вы хотите включить в следующем списке
tweets_list = [[tweet.text, tweet.created_at, tweet.id_str, tweet.user.screen_name, tweet.coordinates, tweet.place, tweet.retweet_count, tweet.favorite_count, tweet.lang, tweet.source, tweet.in_reply_to_status_id_str, tweet.in_reply_to_user_id_str, tweet.is_quote_status] for tweet in tweets]
 
# Создание датафрейма из списка твитов
# Добавьте или удалите столбцы при удалении информации о твите
tweets_df = pd.DataFrame(tweets_list,columns=['Текст твита', 'Дата и время твита', 'ID твита', 'Твиттер @ Имя', 'Координаты твита', 'Информация о месте', 'Ретвиты', 'Избранное', 'Язык', 'Источник', 'ID ответного твита', 'ID пользователя ответного твита', 'Статус цитаты'])
 
# Проверка наличия координат в твитах и, если они есть, извлечение их
tweets_df['Координаты твита'] = tweets_df.apply(extract_coordinates,axis=1)
 
# Проверка наличия информации о месте и, если она есть, извлечение ее
tweets_df['Информация о месте'] = tweets_df.apply(extract_place,axis=1)

В приведенном выше запросе извлекается 150 твитов пользователя Twitter @random, и используются функции extract_coordinates и extract_place для проверки наличия информации и извлечения соответствующей информации, если она есть. Как показано выше, в объектах твитов доступно много информации. Чтобы изменить информацию, вам просто нужно добавить или удалить любой атрибут твита в списке, показанном в tweets_list. При этом также важно изменить имена столбцов при создании датафрейма tweets_df.

Доступ к тексту твита до 280 символов

По умолчанию Tweepy извлекает только текст твита до 140 символов в целях совместимости, поскольку это было старое ограничение на количество символов в твите Twitter. Это может быть неприятно, так как вы, вероятно, захотите использовать всю доступную информацию вместо сокращенных твитов. Чтобы убрать это ограничение, вы должны изменить параметр tweet_mode в tweepy.Cursor. Если вы используете Tweepy, важно установить tweet_mode равным 'extended', потому что если вы не включите это в своих запросах, вы всегда будете парсить твиты, которые сокращены до исходного ограничения в 140 символов. Когда Tweepy установлен в расширенный режим твита, это также изменяет атрибут tweet.text на tweet.full_text. Поэтому убедитесь, что вы соответствующим образом изменяете свой код, если вы используете этот расширенный режим твита. Ниже приведен фрагмент кода, показывающий изменение в tweepy.Cursor и tweets_list для доступа к твитам с более чем 140 символами. Более подробная информация о расширенном режиме твита доступна здесь в документации Tweepy.

username = 'BillGates'
max_tweets = 150
 
# Создание запроса с использованием параметров
tweets = 
tweepy.Cursor(api.user_timeline, id=username, tweet_mode='extended').items(max_tweets)
 
# Извлечение информации из объекта итерируемых твитов
# Добавьте или удалите информацию о твите, которую вы хотите включить в следующем списке
tweets_list = [[tweet.full_text, tweet.created_at, tweet.id_str, tweet.user.screen_name, tweet.coordinates, tweet.place, tweet.retweet_count, tweet.favorite_count, tweet.lang, tweet.source, tweet.in_reply_to_status_id_str, tweet.in_reply_to_user_id_str, tweet.is_quote_status] for tweet in tweets]
 
# Создание датафрейма из списка твитов
# Не включены имена столбцов для упрощения кода
tweets_df = pd.DataFrame(tweets_list)

Получение информации о пользователе из твитов

Информация о пользователе - это то, в чем Tweepy превосходит GetOldTweets3. Представленная ниже картинка, хотя и не является исчерпывающим списком, охватывает большую часть информации, доступной в объекте пользователя Tweepy. Если вам интересно, какие еще данные доступны, полный список информации доступен здесь на сайте разработчика Twitter.

Список информации о пользователе, доступной с помощью Tweepy

Пример поискового запроса, извлекающего всю связанную с пользователем информацию из твитов:

text_query = 'Коронавирус'
max_tweets = 150
 
# Создание метода запроса с использованием параметров
tweets = tweepy.Cursor(api.search,q=text_query).items(max_tweets)
 
# Извлечение информации из объекта итерируемых твитов
# Добавьте или удалите информацию о твите, которую вы хотите в списке ниже
tweets_list = [[tweet.text, tweet.created_at, tweet.id_str, tweet.user.name, tweet.user.screen_name, tweet.user.id_str, tweet.user.location, tweet.user.url, tweet.user.description, tweet.user.verified, tweet.user.followers_count, tweet.user.friends_count, tweet.user.favourites_count, tweet.user.statuses_count, tweet.user.listed_count, tweet.user.created_at, tweet.user.profile_image_url_https, tweet.user.default_profile, tweet.user.default_profile_image] for tweet in tweets]
 
# Создание фрейма данных из списка твитов
# Не включены названия столбцов, чтобы упростить код
tweets_df = pd.DataFrame(tweets_list)

Вышеуказанный запрос ищет 150 недавних твитов, содержащих слово "Коронавирус". Аналогично другому фрагменту кода, показанному ранее. Чтобы изменить доступную информацию, добавьте или удалите любой tweet.user.attribute в списке, показанном в tweets_list.

Парсинг с помощью расширенных запросов

Tweepy предоставляет несколько методов для уточнения ваших запросов. На картинке ниже показан список параметров поиска, доступных через Tweepy. Хотя это не исчерпывающий список, он охватывает большую часть. Если вы хотите увидеть больше информации о поисковом API, она доступна здесь на сайте разработчиков Twitter. Как вы можете заметить с geocode, Tweepy не имеет метода, который принимает строковые версии городов и ищет вокруг них. Вам придется ввести конкретную пару координат широты и долготы, чтобы ограничить запросы по географическому местоположению.

Список параметров поиска, доступных в Tweepy

Пример поискового запроса с использованием расширенных запросов:

# Пример может больше не показывать твиты, если until_date выходит за 7-дневный период с момента запуска ячейки
coordinates = '19.402833,-99.141051,50mi'
language = 'es'
result_type = 'recent'
until_date = '2020-08-10'
max_tweets = 150
 
# Создание метода запроса с использованием параметров
tweets = tweepy.Cursor(api.search, geocode=coordinates, lang=language, result_type = result_type, until = until_date, count = 100).items(max_tweets)
 
# Списковое включение выбранной информации о твите из итерируемого объекта tweets
# Добавьте или удалите информацию о твите, которую вы хотите в списковом включении ниже
tweets_list = [[tweet.text, tweet.created_at, tweet.id_str, tweet.favorite_count, tweet.user.screen_name, tweet.user.id_str, tweet.user.location, tweet.user.url, tweet.user.verified, tweet.user.followers_count, tweet.user.friends_count, tweet.user.statuses_count, tweet.user.default_profile_image, 
tweet.lang] for tweet in tweets]
 
# Создание dataframe из tweets_list
# Не включал названия столбцов, чтобы упростить код
tweets_df = pd.DataFrame(tweets_list)

Вышеуказанный запрос извлекает 150 недавних твитов в Мехико на испанском языке, с последней датой 10 августа 2020 года. Этот фрагмент кода немного отличается от двух предыдущих, показанных ранее. Чтобы уточнить параметры поиска, вам нужно добавить различные параметры, показанные на картинке выше, в tweepy.Cursor(geocode = coordinates, lang=language, и т.д.) и передать ему переменную или задать значение напрямую. Таким образом, вы можете уточнить свой поиск по местоположению, языку или чему угодно вы хотите.

Все вместе

Отлично, я увидел много отдельных вещей, но почему это важно? Независимо от того, хотите ли вы собирать твиты от определенного пользователя, искать твиты в радиусе 50 миль от Лас-Вегаса, Невада (широта 36.169786, долгота -115.139858) с ключевым словом "Коронавирус", ваш парсинг твитов ограничивается только вашей фантазией и атрибутами и методами, доступными в Tweepy. Ниже я покажу вам, насколько легко выбирать методы и информацию, которую вы хотите, показав запрос, упомянутый выше.

Пример запроса, извлекающего информацию о твите и пользователе с использованием расширенного запроса:

text_query = 'Коронавирус'
coordinates = '36.169786,-115.139858,50mi'
max_tweets = 150
 
# Создание метода запроса с использованием параметров
tweets = tweepy.Cursor(api.search, q = text_query, geocode = coordinates, count = 100).items(max_tweets)
 
# Извлечение информации из итерируемого объекта твитов
# Добавьте или удалите информацию о твите, которую вы хотите получить, в списке ниже
tweets_list = [[tweet.text, tweet.created_at, tweet.id_str, tweet.favorite_count, tweet.user.screen_name, tweet.user.id_str, tweet.user.location, tweet.user.followers_count, tweet.coordinates, tweet.place] for tweet in tweets]
 
# Создание фрейма данных из списка твитов
# Я не включил названия столбцов, чтобы упростить код
tweets_df = pd.DataFrame(tweets_list)

Как вы видите выше, просто измените код в tweepy.Cursor(api.search,) с параметрами поиска, чтобы дополнительно уточнить ваш поиск по местоположению, лучшим твитам и т.д. Если вы хотите изменить информацию, которую вы получаете из твитов, просто добавьте или удалите tweet.chosen_attribute в списке tweets_list, который я создал после метода запроса.

Парсинг большего количества данных с помощью GetOldTweets3

_ОБНОВЛЕНИЕ: ИЗ-ЗА ИЗМЕНЕНИЙ В API TWITTER GETOLDTWEETS3 БОЛЬШЕ НЕ РАБОТАЕТ. SNSCRAPE СТАЛ ЗАМЕНОЙ В КАЧЕСТВЕ БЕСПЛАТНОЙ БИБЛИОТЕКИ, КОТОРУЮ ВЫ МОЖЕТЕ ИСПОЛЬЗОВАТЬ ДЛЯ ПАРСИНГА ЗА ПРЕДЕЛАМИ БЕСПЛАТНЫХ ОГРАНИЧЕНИЙ TWEEPY. МОЙ СТАТЬЯ ДОСТУПНА ЗДЕСЬ ДЛЯ _SNSCRAPE.

GetOldTweets3 требует только установки через pip. После импорта библиотеки вы сможете сразу же использовать ее. Если вам нужен код для работы с этим разделом, у меня есть статья Jupyter Notebook здесь. Если вам нужны больше примеров кода и удобные функции, я создал сопутствующий Jupyter Notebook здесь.

Получение дополнительной информации из твитов

На предоставленной ниже картинке представлен полный список информации, доступной в объекте твита через GetOldTweets3. Как видно, в одном твите содержится достаточное количество информации, и ее получение несложно.

Список доступной информации о твите с помощью GetOldTweets3

Пример запроса, извлекающего всю доступную информацию о твитах пользователя:

username = 'jack'
count = 150
 
# Создание объекта запроса tweetCriteria с методами для дополнительной спецификации
tweetCriteria = got.manager.TweetCriteria().setUsername(username)\
.setMaxTweets(count)
    
# Создание итерируемого объекта tweets, содержащего все запрошенные данные о твитах
tweets = got.manager.TweetManager.getTweets(tweetCriteria)
 
# Списковое включение, извлекающее выбранную информацию о твитах из tweets
# Добавьте или удалите информацию о твите, которую вы хотите получить, в списковом включении ниже
tweets_list = [[tweet.id, tweet.author_id, tweet.username, tweet.to, tweet.text, tweet.retweets, tweet.favorites, tweet.replies, tweet.date, tweet.formatted_date, tweet.hashtags, tweet.mentions, tweet.urls, tweet.permalink,] for tweet in tweets]
 
# Создание датафрейма из tweets_list
# Не включены названия столбцов для упрощения кода
tweets_df = pd.DataFrame(tweets_list)

Вышеприведенный запрос извлекает 150 последних твитов пользователя @jack. Как показано выше, чтобы изменить доступную информацию, просто добавьте или удалите атрибуты твита в списковом включении, показанном в tweets_list.

Получение информации о пользователе из твитов

GetOldTweets3 ограничен в доступной информации о пользователе по сравнению с Tweepy. Объект твита этой библиотеки содержит только имя пользователя и идентификатор пользователя. Если вам нужна больше информации о пользователе, чем доступно, я рекомендую либо использовать Tweepy для всего сбора данных, либо использовать методы Tweepy с GetOldTweets3, чтобы использовать обе библиотеки в полной мере. В разделе "Как использовать Tweepy с GetOldTweets3" ниже я покажу некоторые способы обхода этой проблемы.

Парсинг с использованием расширенных запросов

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

Список методов поиска, доступных в GetOldTweets3

Пример поискового запроса с использованием расширенных запросов:

username = "BarackObama"
text_query = "Привет"
since_date = "2011-01-01"
until_date = "2016-12-20"
count = 150
 
# Создание объекта запроса tweetCriteria с методами для дальнейшей спецификации
tweetCriteria = got.manager.TweetCriteria().setUsername(username)\
.setQuerySearch(text_query).setSince(since_date)\
.setUntil(until_date).setMaxTweets(count)
 
# Создание итерируемого объекта tweets, содержащего все запрошенные данные о твите
tweets = got.manager.TweetManager.getTweets(tweetCriteria)
 
# Списковое включение выбранной информации о твите из tweets
# Добавьте или удалите информацию о твите, которую вы хотите в списковом включении ниже
tweets_list = [[tweet.id, tweet.author_id, tweet.username, tweet.text, tweet.retweets, tweet.favorites,tweet.replies,tweet.date] for tweet in tweets]
 
# Создание dataframe из списка tweets
# Не включал названия столбцов для упрощения кода
tweets_df = pd.DataFrame(tweets_list)

Вышеприведенный запрос пытается получить 150 твитов от Барака Обамы, в которых говорится "привет", в диапазоне дат с 1 января 2011 года по 20 декабря 2016 года. Как показано в приведенном выше фрагменте кода, если вы хотите использовать любые методы для создания более конкретных запросов, вам просто нужно добавить их в конце TweetCriteria(). Например, я могу дополнительно уточнить свой поиск в приведенном выше коде, добавив .setNear("Вашингтон, Д.С.") в конце .setMaxTweets(), если я хочу запросить твиты, сделанные в этой области.

Сбор всей информации вместе

Отлично, я могу получать информацию о твитах или получать твиты с 2016 года. Зачем это нужно? Независимо от того, хотите ли вы извлечь всю доступную информацию о конкретном пользователе, искать ключевые слова или искать топовые твиты в Вашингтоне, округ Колумбия, содержащие ключевое слово "Коронавирус" с 5 августа 2020 года по 10 августа 2020 года. Ваш парсинг твитов ограничивается только вашей фантазией и атрибутами и методами, доступными в этом пакете. Ниже я покажу вам, насколько легко выбирать методы и информацию, которую вы хотите, создавая указанный выше запрос.

Пример запроса, извлекающего информацию о твите и пользователе с расширенным запросом:

text_query = 'Коронавирус'
since_date = '2020-08-05'
until_date = '2020-08-10'
location = 'Вашингтон, округ Колумбия'
top_tweets = True
count = 150
 
# Создание объекта запроса tweetCriteria с методами для дальнейшей спецификации
tweetCriteria = got.manager.TweetCriteria()\
.setQuerySearch(text_query).setSince(since_date)\
.setUntil(until_date).setNear(location).setTopTweets(top_tweets)\
.setMaxTweets(count)
 
# Создание итерируемого объекта tweets, содержащего все запрошенные данные о твитах
tweets = got.manager.TweetManager.getTweets(tweetCriteria)
 
# Списковое включение, извлекающее выбранную информацию о твите из tweets
# Добавьте или удалите информацию о твите, которую вы хотите в списковом включении ниже
tweets_list = [[tweet.id, tweet.author_id, tweet.username, tweet.to, tweet.text, tweet.retweets, tweet.favorites, tweet.replies, tweet.date, tweet.mentions, tweet.urls, tweet.permalink,] for tweet in tweets]
 
# Создание фрейма данных из списка твитов
# Добавьте или удалите столбцы, когда вы изменяете информацию о твите
tweets_df = pd.DataFrame(tweets_list)

Как показывает последний пример, уточнение ваших запросов или изменение доступной вам информации о твите довольно просто. Вы уточняете запросы, изменяя объект tweetCriteria, добавляя методы set и передавая значения. Вы удаляете или добавляете больше информации из ваших твитов, изменяя атрибуты твита, перечисленные в tweets_list.

Как использовать Tweepy с GetOldTweets3

Что произойдет, если вы используете GetOldTweets3, но хотите получить доступ к информации о пользователе? Или вы использовали Tweepy, но вам нужен доступ к более старым твитам. Что ж, к счастью, есть обходной путь, который позволяет использовать методы, которые есть в Tweepy, для доступа к большему количеству твитов или информации о пользователе. Это позволяет вам использовать оба инструмента вместе.

Важно помнить, что для использования API Tweepy всегда требуется регистрация для получения учетных данных. Если вам нужно сделать это, в моей предыдущей статье описан процесс. Кроме того, эти методы все еще подчиняются ограничениям запросов Tweepy, поэтому я не рекомендую использовать этот обходной путь для наборов данных, превышающих 20 тысяч твитов, если вы не хотите, чтобы ваш компьютер работал несколько часов. Я лично использовал эти две библиотеки вместе с набором данных из 5 тысяч твитов, и мне потребовалось около 1-2 часов, чтобы все запустить. Если у вас нет времени ждать или вам не помешает заплатить, стоит рассмотреть возможность использования премиального/предприятийного API Twitter. В этой статье описана библиотека searchtweets на Python, которая позволяет получить доступ к премиальному/предприятийному API, если вы решите выбрать этот путь.

Если вам нужен код для следования в этом разделе, у меня есть Jupyter Notebook, доступный здесь.

Учетные данные

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

# consumer_key = "XXXXX"
# consumer_secret = "XXXXX"
# access_token = "XXXXX"
# access_token_secret = "XXXXXX"
auth = tweepy.OAuthHandler(consumer_key, consumer_secret)
auth.set_access_token(access_token, access_token_secret)
api = tweepy.API(auth, wait_on_rate_limit=True)

Подготовка

API Tweepy предлагает два метода, которые позволяют пользователю GetOldTweets3 получить доступ к большему количеству информации.

api.get_status() принимает идентификатор твита и возвращает всю информацию, связанную с этим твитом.

api.get_user() принимает идентификатор пользователя или имя пользователя и возвращает всю информацию, связанную с этим пользователем.

Итак, давайте убедимся, что у нас есть эти данные и соберем tweet.id, tweet.author_id и tweet.username, используя GetOldTweets3.

text_query = 'Привет'
since_date = "2020-7-20"
until_date = "2020-7-21"
count = 150

# Создание объекта запроса tweetCriteria с методами для дальнейшей спецификации
tweetCriteria = got.manager.TweetCriteria()\
.setQuerySearch(text_query).setSince(since_date)\
.setUntil(until_date).setMaxTweets(count)

# Создание итерируемого объекта tweets, содержащего все запрошенные данные о твитах
tweets = got.manager.TweetManager.getTweets(tweetCriteria)

# Списковое включение, извлекающее выбранную информацию о твитах из tweets
# Добавьте или удалите информацию о твите, которую вы хотите получить, в списковом включении ниже
tweets_list = [[tweet.id, tweet.author_id, tweet.username, tweet.text, tweet.retweets, tweet.favorites, tweet.replies, tweet.date] for tweet in tweets]

# Создание фрейма данных из списка твитов
# Добавьте или удалите столбцы, по мере удаления информации о твите
tweets_df = pd.DataFrame(tweets_list, columns=['Tweet Id', 'Tweet User Id', 'Tweet User', 'Text', 'Retweets', 'Favorites', 'Replies', 'Datetime'])

Функции

Отлично, у нас есть данные с tweet.id, tweet.author_id и tweet.username. Давайте проверим эти методы из Tweepy, чтобы убедиться, что они работают.

api.get_status(1285363852851511301)
api.get_user(811267164476841984)
api.get_user('realJakeLogan')

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

def extract_tweepy_tweet_info(row):
    tweet = api.get_status(row['Tweet Id'])
    return tweet.source

tweets_df['Tweet Source'] = tweets_df.apply(extract_tweepy_tweet_info, axis=1)

Это отлично, но что произойдет, если вы хотите вернуть несколько атрибутов из объекта твита? Возможно, вам также нужны tweet.user.location и tweet.user.followers_count. Что ж, есть два способа сделать это. Создайте функцию для сохранения этих данных в список, а затем добавьте все данные в фрейм данных. Или создайте функцию, которая будет создавать серию и возвращать ее, а затем используйте метод apply из библиотеки pandas, чтобы применить функцию к фрейму данных. Я покажу первый способ, так как он проще понять.

# Создание списка для хранения данных о твитах
tweets_holding_list = []

def extract_tweepy_tweet_info_efficient(row):
    # Использование API Tweepy для запроса данных о твите
    tweet = api.get_status(row['Tweet Id'])
    
    # Сохранение выбранных данных о твите в tweets_holding_list для дальнейшего использования
    tweets_holding_list.append((tweet.source, tweet.user.statuses_count, tweet.user.followers_count, tweet.user.verified))

# Применение функции extract_tweepy_tweet_info_efficient для сохранения данных о твите в tweets_holding_list
tweets_df_test_efficient.apply(extract_tweepy_tweet_info_efficient, axis=1)

# Создание новых столбцов для хранения данных, которые в данный момент находятся в tweets_holding_list
tweets_df_test_efficient[['Tweet Source', 'User Tweet Count', 'Follower Count', 'User Verified Status']] = pd.DataFrame(tweets_holding_list)

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


Вот и все для моего продвинутого руководства по Tweepy и GetOldTweets3, а также моего обходного пути для использования Tweepy с GetOldTweets3. Надеюсь, большинство ваших вопросов должны быть решены моей предыдущей статьей или этой статьей. Если у вас есть конкретные вопросы и вы не можете найти ответы в Google или хотите связаться со мной, я доступен на LinkedIn.

Ссылки

Если вас интересует, подпишитесь на нашу рассылку Socialscrapr: https://upscri.be/3kcmqx

Статья о скрапинге с использованием snscrape в качестве замены GetOldTweets3: https://medium.com/better-programming/how-to-scrape-tweets-with-snscrape-90124ed006af

Предыдущая статья о базовом парсинге твитов: https://towardsdatascience.com/how-to-scrape-tweets-from-twitter-59287e20f0f1

GitHub с парсером твитов, описанным в этом учебнике: https://github.com/MartinKBeck/TwitterScraper/tree/master/AdvScraper

GitHub с базовым и продвинутым парсерами твитов: https://github.com/MartinKBeck/TwitterScraper

Различные API, предлагаемые Tweepy: https://developer.twitter.com/en/products/products-overview

GitHub Tweepy: https://github.com/tweepy/tweepy

GitHub GetOldTweets3: https://github.com/Mottl/GetOldTweets3

Учебная статья о доступе к премиум/корпоративным API Twitter с использованием searchtweets: https://lucahammer.com/2019/11/05/collecting-old-tweets-with-the-twitter-premium-api-and-python/