CoderCastrov logo
CoderCastrov
Парсер

Парсинг твитов с помощью библиотеки Tweepy Python

Парсинг твитов с помощью библиотеки Tweepy Python
просмотров
5 мин чтение
#Парсер

Это пошаговое руководство по парсингу твитов 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.