Как все еще парсить миллионы твитов в 2023 году с использованием twscrape
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:
Вот и все на данный момент. Если эта информация была полезной для вас, не забудьте подписаться, чтобы получать уведомления о новых публикациях.