CoderCastrov logo
CoderCastrov
Твиттер

Как все еще парсить миллионы твитов в 2023 году с использованием twscrape

Как все еще парсить миллионы твитов в 2023 году с использованием twscrape
просмотров
4 мин чтение
#Твиттер

Twitter - отличное место для сбора данных и анализа различных трендов. Многие команды аналитики использовали этот источник для своих моделей.

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

Однако данные все еще можно собирать таким же образом, как и раньше, используя подход с авторизованным аккаунтом.

Введение в twscrape

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

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

0. Требования:

  • Python 3.10 или выше

1. Установка twscrape:

pip install twscrape

Или версия разработки с последними функциями:

pip install git+https://github.com/vladkens/twscrape.git

2. Добавление рабочих аккаунтов:

Twscape нуждается в аккаунтах Twitter для работы. У каждого аккаунта есть ограничение на использование API.

Twscape нуждается в аккаунтах Twitter для работы. У каждого аккаунта есть ограничение на использование API, после чего некоторое время невозможно делать запросы через этот аккаунт. twscrape разработан таким образом, чтобы переключаться на другие аккаунты, когда один из них недоступен. Таким образом, поток данных выглядит непрерывным для пользователя, хотя на самом деле запросы поступают из разных аккаунтов внутренне.

Аккаунты можно добавить двумя способами, через API программы или команду CLI.

Давайте воспользуемся командой CLI:

# twscrape add_accounts <file_path> <line_format>
# line_format должен содержать токены "username", "password", "email", "email_password"
# разделитель токенов должен быть таким же, как в файле
twscrape add_accounts accounts.txt username:password:email:email_password

Примечание: Можно зарегистрировать новый аккаунт или купить на специальных веб-сайтах, например здесь.

Затем вам нужно пройти процедуру входа в систему, чтобы получить токены для запроса API. Это не быстрый процесс, но он нужен один раз после добавления новых аккаунтов. Затем токен сохраняется в базе данных SQLite и используется повторно для последующих запросов.

twscrape login_accounts

_Примечание: _Не все аккаунты могут пройти авторизацию из-за системы противодействия мошенничеству. Вы можете попробовать войти в эти аккаунты позже.

Использование twscrape

Вы можете использовать twscrape двумя способами.

Получение информации о твите из командной строки (CLI):

twscrape tweet_details 1674894268912087040

Результат:

{
  "id": 1674894268912087000,
  "id_str": "1674894268912087040",
  "url": "https://twitter.com/elonmusk/status/1674894268912087040",
  "date": "2023-06-30 21:34:46+00:00",
  "user": {
    "id": 44196397,
    "id_str": "44196397",
    "url": "https://twitter.com/elonmusk",
    "username": "elonmusk",
    "displayname": "Elon Musk",
    "created": "2009-06-02 20:12:29+00:00",
    // ...
    "_type": "snscrape.modules.twitter.User"
  },
  "lang": "en",
  "rawContent": "На прошлой неделе данная платформа достигла нового рекорда по количеству пользовательских секунд"
  // ...
}

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

Парсинг твитов по текстовому запросу с помощью Python API

С использованием приведенного ниже кода мы получаем 5000 твитов с ключевыми словами "Elon Musk" в период с 1 января 2023 года по 31 мая 2023 года. Затем выводим в консоль идентификатор твита, автора твита и содержимое.

import asyncio
from twscrape import API, gather
from twscrape.logger import set_log_level

async def main():
    api = API()
    
    q = "elon musk since:2023-01-01 until:2023-05-31"
    async for tweet in api.search(q, limit=5000):
        print(tweet.id, tweet.user.username, tweet.rawContent)


if __name__ == "__main__":
    asyncio.run(main())

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

Работа с исходными ответами API

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

import asyncio
from twscrape import API, gather
from twscrape.logger import set_log_level

async def main():
    api = API()
    
    q = "elon musk since:2023-01-01 until:2023-05-31"
    async for rep in api.search_raw(q, limit=5000):
        # rep - это объект httpx.Response
        print(rep.status_code, rep.json())

if __name__ == "__main__":
    asyncio.run(main())

Или то же самое из командной строки:

twscrape search "elon musk since:2023-01-01 until:2023-05-31" --raw

Список доступных функций

  • search - обычный поиск по ключевым словам
  • tweet_details - информация о конкретном твите
  • retweeters - список пользователей, которые ретвитнули конкретный твит
  • favoriters - список пользователей, которым понравился конкретный твит
  • user_by_login - получить профиль пользователя по логину
  • user_by_id - получить профиль пользователя по идентификатору
  • user_tweets - список твитов конкретного пользователя (максимум 3200 твитов)
  • user_tweets_and_replies - список твитов и ответов конкретного пользователя
  • followers - список подписчиков конкретного пользователя
  • following - список пользователей, на которых подписан пользователь
  • list_timeline - получить все твиты из списка

_Нашли ошибку или нужна новая функция? Не стесняйтесь _открыть issue


Больше примеров использования можно найти на странице проекта на Github:


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