Парсинг твитов с помощью библиотеки Tweepy Python
Table Of Content
- Это пошаговое руководство по парсингу твитов Twitter с использованием библиотеки Python под названием Tweepy.
- Исследование случая: Протестное движение в Гонконге 2019 года
- Подготовка: Создание аккаунта разработчика Twitter
- Импорт библиотек
- Аутентификация Twitter API
- Twitter credentials
- Получите их из вашей учетной записи разработчика Twitterconsumer_key = <ваш_ключ_потребителя>
- Пакетный парсинг
- Инициализируем эти переменные:
- Дополнительные материалы
- Выполнение анализа тональности твитов с использованием Python
- Анализ тональности относится к методу идентификации и классификации мнений, выраженных в текстовом сообщении...
Это пошаговое руководство по парсингу твитов Twitter с использованием библиотеки Python под названием Tweepy.
Исследование случая: Протестное движение в Гонконге 2019 года
В этом примере мы будем извлекать твиты, связанные с протестным движением в Гонконге 2019 года, о котором я написал анализ. Коды могут быть настроены под ваши собственные потребности.
Первым делом я решил получить твиты. Я рассмотрел и попробовал такие инструменты, как Octoparse, но они либо поддерживают только Windows (я использую Macbook), были ненадежными, либо позволяют загрузить только определенное количество твитов, если вы не подписаны на план. В конце концов, я отбросил эти идеи и решил сделать это самостоятельно.
Я попробовал несколько библиотек Python и решил продолжить работу с Tweepy. Tweepy была единственной библиотекой, которая не вызывала ошибок в моей среде, и было довольно легко начать работу. Однако одним из недостатков является то, что я не смог найти документацию, которая бы указывала значения параметров для извлечения определенной метаданных из твита. Я смог получить большинство из них, которые мне понадобились, после нескольких раундов проб и ошибок.
Подготовка: Создание аккаунта разработчика Twitter
Прежде чем начать использовать Tweepy, вам понадобится аккаунт разработчика Twitter, чтобы вызывать API Twitter. Просто следуйте инструкциям, и через некоторое время (у меня заняло всего несколько часов) они предоставят вам доступ.
Вам понадобится 4 куска информации - ключ API, секретный ключ API, токен доступа, секретный токен доступа.
Импорт библиотек
Перейдите в Jupyter Notebook и импортируйте следующие библиотеки:
Аутентификация Twitter API
Если вы столкнулись с ошибками аутентификации, сгенерируйте новые ключи и попробуйте снова.
# Twitter credentials
# Получите их из вашей учетной записи разработчика Twitterconsumer_key = <ваш_ключ_потребителя>
consumer_secret = <ваш_секретный_ключ_потребителя>
access_key = <ваш_ключ_доступа>
access_secret = <ваш_секретный_ключ_доступа># Передайте ваши учетные данные Twitter в tweepy через OAuthHandlerauth = OAuthHandler(consumer_key, consumer_secret)
auth.set_access_token(access_key, access_secret)
api = tweepy.API(auth)
Пакетный парсинг
Из-за ограниченного количества вызовов API, которые можно сделать с помощью бесплатной учетной записи разработчика (около 900 вызовов каждые 15 минут до отказа в доступе), я создал функцию, которая извлекает 2500 твитов за один запуск каждые 15 минут (я пытался извлечь 3000 и больше, но после второй партии меня отказали). В этой функции вы указываете:
Я извлек только те метаданные, которые я считал важными для своего случая. Вы можете подробно изучить список метаданных из объекта tweepy.Cursor (это настоящая беспорядочность).
def scraptweets(search_words, date_since, numTweets, numRuns):
# Определите цикл for для генерации твитов через равные интервалы
# Мы не можем сделать большой вызов API за один раз. Поэтому давайте попробуем T раз
# Определите pandas dataframe для хранения данных:
db_tweets = pd.DataFrame(columns = ['username', 'acctdesc', 'location', 'following',
'followers', 'totaltweets', 'usercreatedts', 'tweetcreatedts',
'retweetcount', 'text', 'hashtags']
)
program_start = time.time()
for i in range(0, numRuns):
# Засекаем время, сколько занимает сбор твитов для каждого запуска:
start_run = time.time()
# Собираем твиты с помощью объекта Cursor
# .Cursor() возвращает объект, по которому вы можете итерировать или циклически обращаться к собранным данным.
# У каждого элемента в итераторе есть различные атрибуты, к которым вы можете обратиться, чтобы получить информацию о каждом твите
tweets = tweepy.Cursor(api.search, q=search_words, lang="en", since=date_since, tweet_mode='extended').items(numTweets)# Сохраняем эти твиты в список Python
tweet_list = [tweet for tweet in tweets]# Получаем следующую информацию (методы для их вызова):
# user.screen_name - имя пользователя Twitter
# user.description - описание аккаунта
# user.location - откуда он твитит
# user.friends_count - количество пользователей, которых следует пользователь (following)
# user.followers_count - количество пользователей, которые следуют за этим пользователем (followers)
# user.statuses_count - общее количество твитов пользователя
# user.created_at - когда была создана учетная запись пользователя
# created_at - когда был создан твит
# retweet_count - количество ретвитов
# (устаревшее) user.favourites_count - вероятно, общее количество твитов, которые пользователь отметил как избранные
# retweeted_status.full_text - полный текст твита
# tweet.entities['hashtags'] - хэштеги в твите# Начинаем сбор твитов по отдельности:
noTweets = 0for tweet in tweet_list:# Извлекаем значения
username = tweet.user.screen_name
acctdesc = tweet.user.description
location = tweet.user.location
following = tweet.user.friends_count
followers = tweet.user.followers_count
totaltweets = tweet.user.statuses_count
usercreatedts = tweet.user.created_at
tweetcreatedts = tweet.created_at
retweetcount = tweet.retweet_count
hashtags = tweet.entities['hashtags']try:
text = tweet.retweeted_status.full_text
except AttributeError: # Не ретвит
text = tweet.full_text# Добавляем 11 переменных в пустой список - ith_tweet:
ith_tweet = [username, acctdesc, location, following, followers, totaltweets,
usercreatedts, tweetcreatedts, retweetcount, text, hashtags]# Добавляем в dataframe - db_tweets
db_tweets.loc[len(db_tweets)] = ith_tweet# Увеличиваем счетчик - noTweets
noTweets += 1
# Завершение запуска:
end_run = time.time()
duration_run = round((end_run-start_run)/60, 2)
print('количество собранных твитов для запуска {} составляет {}'.format(i + 1, noTweets))
print('время выполнения {} запуска составляет {} мин'.format(i+1, duration_run))
time.sleep(920) #15 минут пауза# После завершения всех запусков сохраняем их в одном файле CSV:
from datetime import datetime
# Получаем отметку времени в читаемом формате
to_csv_timestamp = datetime.today().strftime('%Y%m%d_%H%M%S')# Определяем рабочий путь и имя файла
path = os.getcwd()
filename = path + '/data/' + to_csv_timestamp + '_sahkprotests_tweets.csv'# Сохраняем dataframe в CSV с отметкой времени создания
db_tweets.to_csv(filename, index = False)
program_end = time.time()
print('Сбор данных завершен!')
print('Общее время сбора составляет {} минут.'.format(round(program_end - program_start)/60, 2))
С помощью этой функции я обычно выполнял 6 запусков в общей сложности, где каждый запуск извлекал 2500 твитов. Обычно требуется примерно 2,5 часа, чтобы завершить один раунд извлечения, который дает 15000 твитов. Неплохо.
Касательно протестов, я изучил Twitter и выяснил наиболее распространенные хэштеги, используемые пользователями в своих твитах. Поэтому я использовал множество этих связанных хэштегов в качестве критерия поиска.
Также возможно, что в вашем параметре "search_words" могут появиться другие хэштеги, которые не определены, потому что пользователи могут включать их в свои твиты.
# Инициализируем эти переменные:
search_words = "#hongkong OR #hkprotests OR #freehongkong OR #hongkongprotests OR #hkpolicebrutality OR #antichinazi OR #standwithhongkong OR #hkpolicestate OR #HKpoliceterrorist OR #standwithhk OR #hkpoliceterrorism"
date_since = "2019-11-03"
numTweets = 2500
numRuns = 6# Вызываем функцию scraptweets
scraptweets(search_words, date_since, numTweets, numRuns)
Я запускал вышеуказанный скрипт ежедневно с 3 ноября 2019 года и с тех пор накопил более 200 тысяч твитов. Ниже приведены первые 5 строк набора данных:
Дополнительные материалы
Выполнение анализа тональности твитов с использованием Python
Анализ тональности относится к методу идентификации и классификации мнений, выраженных в текстовом сообщении...
plainenglish.io
Больше контента на PlainEnglish.io. Подпишитесь на наш бесплатный еженедельный бюллетень. Подписывайтесь на нас в Twitter, LinkedIn, YouTube, и Discord**.**
Интересуетесь масштабированием своего стартапа в сфере программного обеспечения? Посмотрите Circuit.