CoderCastrov logo
CoderCastrov
Питон

Миллион твитов и счетчик: как Snscrape может помочь вам собирать большие данные с Twitter!

Миллион твитов и счетчик: как Snscrape может помочь вам собирать большие данные с Twitter!
просмотров
7 мин чтение
#Питон
Table Of Content

Привет, уважаемые энтузиасты Django и Python! В ScaleReal мы активно работаем над приложениями на Python/Django и создали множество высокомасштабируемых приложений для наших клиентов.

В процессе работы над такими приложениями мы исследовали сбор твитов с помощью Snscrape. В этой статье мы узнаем больше о нем. Итак, приступим!

Вот список всего, что будет рассмотрено в этой статье:


Что такое snscrape?

snscrape - это парсер для социальных сетей (СС). Он парсит такие вещи, как профили пользователей, хэштеги или поисковые запросы и возвращает найденные элементы, например, соответствующие сообщения.

Интересно, что snscrape не только для парсинга твитов, но также используется на различных социальных сетях, таких как Facebook, Instagram, Mastodon, Telegram, Reddit, VKontakte и Weibo (Sina Weibo).

Теперь вы можете задаться вопросом, разрешено ли парсить данные с Twitter?

Да, совершенно легально парсить данные, доступные на Twitter. Вы можете извлекать общедоступную информацию, но следует помнить, что извлеченные данные могут содержать личную информацию.

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

Почему snscrape?

Если вам нужно получить бесконечное количество твитов, вы должны использовать Snscrape. Но если вам нужны дополнительные функции, которые Snscrape не может предоставить (например, геолокация), то вам определенно следует использовать Tweepy. Он напрямую интегрирован с API Twitter и предоставляет полный функционал.

Другие доступные варианты

1. Tweepy

Tweepy - одна из самых популярных библиотек Python для настройки доступа к Twitter. Вы создаете учетную запись разработчика Twitter, получаете учетные данные и начинаете парсить. Это отличный инструмент для простой автоматизации, создания ботов Twitter или небольшого школьного проекта. Однако у Tweepy есть ограничение на парсинг 3200 твитов и ограничение по времени на неделю. Нет доступа к историческим данным.

2. GetOldTweets3

Twitter удалил конечную точку, которую использует GetOldTweets3, и это делает GOT более непригодным для использования. Вы найдете много проектов на GitHub, которые использовали GetOldTweets3, но на 4 мая 2020 года не было обновлений пакета, чтобы соответствовать пересмотренным руководствам Twitter.

3. TWINT

Twint - это продвинутый инструмент, написанный на Python, но Twitter, по-видимому, имеет более строгое ограничение на устройство + блокировку IP-адреса после определенного количества запросов. Это может быть удачей или неудачей. У многих людей возникают проблемы с его установкой. Автор библиотеки рекомендует временно использовать Dockerfile, пока решение не станет более ясным. Больше информации о TWINT можно найти здесь.

4. Octoparse

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

Установка snscrape

pip3 install snscrape

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

pip3 install git+https://github.com/JustAnotherArchivist/snscrape.git

💡 Примечание: Чтобы выполнять команды git CLI, вы должны установить git перед выполнением команды pip. Если вы не выполните указанный шаг, вышеуказанная команда склонирует репозиторий с GitHub, но не выполнится, если git не установлен.

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

Есть два способа использования snscrape.

Использование snscrape из командной строки, терминала (Преобразование JSON файлов для Python)

Независимо от того, запускаете ли вы команды напрямую в терминале или через Python, это двухэтапный процесс, в котором вы сначала собираете данные в JSON файл, а затем преобразуете данные для использования в Python. В этом разделе будет рассмотрено скрапинг с помощью команд CLI, а затем использование Pandas для чтения JSON файла.

В приведенном ниже примере мы собираем 100 твитов пользователя Twitter с именем @jack. Код вводится в командной строке/терминале. Код использует несколько необязательных аргументов, которые объясняются ниже.

  • -jsonl Выводит данные в формате JSON, позволяя получить доступ к информации о твите. В противном случае вы получите только прямые ссылки на твиты.
  • -progress Позволяет получать обновления из CLI, сообщающие о ходе скрапинга. Обновления происходят каждые 100 твитов. Кажется, что это не работает при использовании Python с CLI.
  • -max-results # Устанавливает ограничение на количество собираемых твитов.
snscrape --jsonl --progress --max-results 100 twitter-search "from:jack" > user-tweets.json

Парсинг исторических твитов по текстовому запросу:

В приведенном ниже примере мы парсим 500 твитов с 1 июня 2022 года по 31 июля 2022 года с текстовым запросом "its the elephant". В коде ниже есть два новых аргумента.

  • -since Устанавливает нижнюю границу даты запроса
  • “until:” Устанавливает верхнюю границу даты запроса
snscrape --jsonl --progress --max-results 500 --since 2022-06-01 twitter-search "its the elephant until:2022-07-31" > text-query-tweets.json

Важно отметить, что — since является необязательным аргументом, который вы можете использовать, но until: является оператором, используемым внутри запроса twitter-search. Это может показаться странным, но это дало мне более последовательные результаты, чем если бы оба аргумента были включены в запрос, как показано ниже.

snscrape --jsonl --progress --max-results 500 twitter-search "its the elephant since:2020-06-01 until:2020-07-31" > text-query-tweets.json

Вы можете попробовать оба метода и посмотреть, какой дает вам лучшие результаты. Однако первый метод, использующий — since, дал более последовательные результаты до сих пор.

Использование CLI с помощью Python

Если вам не нравится работать непосредственно в терминале, библиотека OS в Python позволяет нам выполнять команды CLI в Python. Она фактически выполняет те же самые команды, что и выше, но в Python.

Парсинг твитов конкретного пользователя в Twitter:

import os

# Использование библиотеки OS для вызова команд CLI в Python
os.system("snscrape --jsonl --max-results 100 twitter-search 'from:jack'> user-tweets.json")

Парсинг исторических твитов по текстовому запросу:

import os

# Использование библиотеки OS для вызова команд CLI в Python
os.system("snscrape --jsonl --max-results 500 --since 2022-12-01 twitter-search 'its the elephant until:2023-01-17' > text-query-tweets.json")

Если вы обнаружите, что приведенный выше код не работает из-за ошибки с "and", это может быть связано с тем, как ваша операционная система обрабатывает двойные/одинарные кавычки. Приведенный выше код работает в операционной системе Windows. Если вы обнаружите, что приведенный выше код вызывает ошибки, надеюсь, что предложенное ниже решение поможет вам.

import os

# Использование библиотеки OS для вызова команд CLI в Python
os.system("snscrape --jsonl --max-results 500 --since 2022-12-01 twitter-search \"its the elephant until:2023-01-17\" > text-query-tweets.json")

Конвертация JSON файлов для использования в Python

Отлично, наши данные доступны в формате JSON, но как с ними взаимодействовать? Приведенный ниже код показывает, как мы можем использовать библиотеку Pandas для преобразования JSON файлов в объекты типа "data frame", чтобы мы могли работать с ними в Python.

import pandas as pd

# Чтение JSON файла, созданного с помощью команд CLI, и создание объекта типа "data frame" в Pandas
tweets_df = pd.read_json('text-query-tweets.json', lines=True)

Все довольно просто. Теперь вы можете взаимодействовать с данными в формате JSON любым удобным для вас способом, так как они хранятся в объекте типа "data frame" в Pandas. Вы можете экспортировать их в CSV файл или файл Excel, или изменять данные в объекте типа "data frame" в Pandas. Это зависит от вас!

2. Использование snscrape через обертку Python

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


💡ПРИМЕЧАНИЕ: Время выполнения остается одинаковым, независимо от количества объявленных атрибутов.

Парсинг твитов определенного пользователя в Twitter

Используя приведенный ниже код, мы можем спарсить 1000 твитов пользователя Twitter с именем @jack. Затем мы можем извлечь атрибуты DateTime, tweet id, text и username из объекта твита.

# импорт библиотек и пакетов
import snscrape.modules.twitter as sntwitter
import pandas

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

# Использование TwitterSearchScraper для парсинга данных и добавления твитов в список
for i,tweet in enumerate(sntwitter.TwitterSearchScraper('from:jack').get_items()): #указываем имя пользователя 
    if i>1000: #количество твитов, которые вы хотите спарсить
        break
    tweets_list1.append([tweet.date, tweet.id, tweet.content, tweet.user.username]) #указываем атрибуты, которые нужно извлечь
    
# Создание фрейма данных из списка твитов выше
tweets_df1 = pd.DataFrame(tweets_list1, columns=['Datetime', 'Tweet Id', 'Text', 'Username'])

Парсинг твитов по текстовому запросу

Используя приведенный ниже код, мы парсим 5000 твитов с ключевыми словами 'COVID Vaccine' в период с 1 января 2022 года по 31 мая 2022 года. Затем мы извлекаем атрибуты DateTime, tweet id, text и username из объекта твита.

import snscrape.modules.twitter as sntwitter
import pandas

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

# Использование TwitterSearchScraper для парсинга данных и добавления твитов в список
for i,tweet in enumerate(sntwitter.TwitterSearchScraper('COVID Vaccine since:2022-01-01 until:2022-05-31').get_items()):
    if i>5000:
        break
    tweets_list2.append([tweet.date, tweet.id, tweet.content, tweet.user.username])
    
# Создание фрейма данных из списка твитов выше
tweets_df2 = pd.DataFrame(tweets_list2, columns=['Datetime', 'Tweet Id', 'Text', 'Username'])

Вот и все от меня, разработчики! 👨‍💻 Спасибо за чтение!


Если вам понравилась эта статья, пожалуйста, нажмите кнопку 👏 и поделитесь, чтобы помочь другим найти ее! Не стесняйтесь оставить комментарий 💬 ниже. Вы можете связаться со мной на GitHub, LinkedIn, и Twitter.

Есть отзывы? Давайте свяжемся здесь.

~Акаш Шривастава