CoderCastrov logo
CoderCastrov
Твиттер

Как парсить 1 миллион твитов — без использования Twitter API

Как парсить 1 миллион твитов — без использования Twitter API
просмотров
8 мин чтение
#Твиттер

Мы спарсили 1 миллион твитов, в которых упоминался хэштег "Ислам", примерно за 12 часов.

Зачем важен Twitter

Twitter - одна из самых важных социальных платформ, используемая физическими лицами, компаниями, активистами, СМИ и правительствами. Фактически, некоторые могут утверждать, что это де-факто городская площадь мира (Wall Street Journal 2022). Twitter сыграл решающую роль в развитии мировых событий, таких как "Арабская весна", "Black Lives Matter", #MeToo, спорные выборы и пандемия COVID-19.

Микроблоггинговый подход позволяет людям отправлять короткие сообщения, заставляя их сосредоточиться на краткости и качестве, что позволяет идеям быстро распространяться через плотные сети. Это отличный способ связаться с единомышленниками и формировать сообщества таким образом, которого не хватает другим платформам, таким как Facebook, Youtube и, возможно, Reddit.

Каждую секунду, в среднем, на Twitter публикуется около 6000 твитов […], что соответствует более чем 350 000 твитов в минуту, 500 миллионов твитов в день и около 200 миллиардов твитов в год. (Internet Live Stats)

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

Скажите пока-пока Twitter API

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

К сожалению, прозрачный подход Twitter, похоже, подходит к концу с покупкой компании Илоном Маском. В октябре 2022 года Маск купил компанию по завышенной цене, что создало значительные финансовые трудности для компании. Несмотря на увольнение более 75% сотрудников, продажу мебели и невыплату счетов Twitter, финансовое положение компании оставалось напряженным. В прошлом месяце Маск объявил, что значительные изменения ожидают Twitter API, включая удаление бесплатной опции (The Guardian 2023).

Что же делать исследователю? К счастью, существуют альтернативы Twitter API для парсинга твитов, такие как SNScrape. Мы расскажем вам, как именно это сделать ниже.


SNScrape: Бесплатный, быстрый и открытый исходный код

К сожалению, в самом проекте SNScrape нет доступной документации. Хотя на YouTube и Medium есть много обучающих материалов, многие из них устарели. В этом посте мы покажем вам, как с помощью SNScrape можно скрэпить один миллион твитов, связанных с хэштегом, вместо использования Twitter API.

Пример проекта: Создание размеченного набора данных для обучения моделей машинного обучения для быстрого определения онлайн-ненависти и призывов к насилию против мусульман

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

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

Мы нашли твиты в Индии, где пользователи открыто призывали убивать мусульман или осуществлять переселение населения на английском языке, и они оставались незамеченными, потому что использовали слова вроде "Pissful" (то есть "мирные" мусульмане), Абдель, Магомеданский и т. д.

Для обучения модели обычно требуется сотни тысяч данных. Мы стремились получить 1 миллион, на случай, если нам потребуется очистить данные. Ниже приведено пошаговое руководство о том, как это сделать.

Данные из одного твита

Хотя сам твит ограничен 280 символами, из него можно получить достаточно много данных.

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

Пошаговое руководство

Вот обзор всех шагов, необходимых для парсинга твитов.

Шаг 1: Установка необходимых библиотек

Для начала нам понадобится установить два пакета Python: snscrape и pandas. Вы можете установить их с помощью команд pip в командной строке (убедитесь, что используете привилегии администратора):

# Установка библиотек
pip install snscrape
pip install pandas

Шаг 2: Импорт библиотек

После установки необходимых библиотек пришло время начать писать код. Начните с импорта необходимых библиотек в вашей среде разработки. Вам не понадобится устанавливать библиотеки csv, datetime или time, так как они идут в комплекте с Python по умолчанию.

import csv
from datetime import date
import pandas as pd
import snscrape.modules.twitter as sntwitter
import time

Шаг 3: Создание переменной для хранения хэштега, целевого числа хэштегов и имени файла

Затем мы настроим запрос хэштега, который мы хотим спарсить, максимальное количество твитов для парсинга и создадим имя файла, используя количество твитов вместе с текущей датой. Когда вы начнете собирать данные, вы, вероятно, будете делать это снова и снова и сгенерируете много файлов. Поэтому важно иметь возможность установить описательное имя файла, чтобы вы могли отличить его друг от друга. Мы также сгенерируем имя файла с текущей датой и временем.

hashtag_query = "ислам"
limit = 1000000
limit_as_string = str(limit)
filename = "путь_к_папке\_" + limit_as_string + "_твиты_" + hashtag_query + "_" + str(date.today().strftime("%m-%d-%y")) + ".csv"
print("Сгенерированное имя файла: ", filename)

Шаг 4: Создание списка для хранения твитов

Мы создадим пустой список для хранения твитов и переменную для хранения URL профиля Twitter, чтобы объединить имя пользователя с ним и получить полный URL.

tweets = []
twitter_profile_url = "https://twitter.com/"

Шаг 5: Создание переменных для отслеживания количества и интервалов ожидания

Мы также создадим переменную для подсчета количества спарсенных твитов и переменную для установки интервала времени ожидания скрипта. Мы установим его на 15 минут, чтобы скрипт не был заблокирован Twitter. (Интересный факт: я случайно закомментировал функцию ожидания, поэтому, когда я спарсил 1 000 000 твитов, я сделал это без блокировки).

count = 0
sleep_time = 900

Шаг 6: Запуск цикла for для парсинга твитов и добавления каждого твита в список

Мы будем использовать цикл for для итерации по классу TwitterSearchScraper из snscrape. Этот класс позволяет нам искать твиты с определенным хэштегом или запросом. Мы также будем выводить количество, чтобы вы могли видеть, сколько твитов было спарсено в цикле for. Мы прервем цикл, как только достигнем лимита твитов, которые мы хотим спарсить.

for tweet in sntwitter.TwitterSearchScraper(hashtag_query).get_items():
    if len(tweets) == limit:
        break
    else:
        #print(tweets)
        count += 1
        if count % 2000 == 0:
            print("Засыпаем на ", sleep_time/60, " минут")
            time.sleep(sleep_time)
        tweets.append([
            tweet.date,
            tweet.url,
            tweet.content,
            tweet.renderedContent,
            tweet.id,
            tweet.user.username,
            tweet.user.displayname,
            tweet.user.id,
            twitter_profile_url + tweet.user.username,
            tweet.user.description,
            tweet.user.verified,
            tweet.user.created,
            tweet.user.followersCount,
            tweet.user.friendsCount,
            tweet.user.statusesCount,
            tweet.user.location,
            tweet.user.descriptionUrls,
            tweet.user.linkUrl,
            tweet.user.profileImageUrl,
            tweet.user.profileBannerUrl,
            tweet.replyCount,
            tweet.retweetCount,
            tweet.likeCount,
            tweet.quoteCount,
            tweet.lang,
            tweet.source,
            tweet.retweetedTweet,
            tweet.quotedTweet,
            tweet.mentionedUsers,
            tweet.hashtags
        ])
        print("Спарсено твитов:", count)

Шаг 7: Загрузка данных из списка в pandas dataframe

Затем мы создадим pandas dataframe с именем 'df' и создадим имя столбца для каждого из параметров, спарсенных из аргумента scraper. Вам не обязательно использовать параметры Twitter для названий столбцов, вы можете придумать свои собственные, которые вы найдете более полезными. Однако я рекомендую использовать подчеркивание в заголовках столбцов, чтобы вы могли получить к ним доступ позже с помощью Pandas, иначе вам придется использовать позицию этого столбца, что немного сложнее и может вызвать проблемы в дальнейшем, если вы добавите или удалите столбцы.

df = pd.DataFrame(tweets, columns=[
    'дата',
    'url_твита',
    'содержание_твита',
    'отформатированное_содержание_твита',
    'id_твита',
    'имя_пользователя',
    'отображаемое_имя',
    'id_пользователя',
    'соединенный_url_профиля',
    'описание_пользователя',
    'проверенный',
    'дата_создания_профиля',
    'количество_подписчиков',
    'количество_друзей',
    'количество_твитов',
    'местоположение_пользователя',
    'url_описания_пользователя',
    'url_профиля_пользователя',
    'url_изображения_профиля_пользователя',
    'url_баннера_профиля_пользователя',
    'количество_ответов_на_твит',
    'количество_ретвитов_твита',
    'количество_лайков_твита',
    'количество_цитат_твита',
    'язык_твита',
    'источник_твита',
    'id_оригинального_ретвита',
    'id_оригинального_цитата',
    'упомянутые_пользователи_в_твите',
    'хэштеги_в_твите'
])
print(df)

Шаг 8: Запись pandas dataframe в .csv

И наконец, мы записываем pandas dataframe в .csv.

df.to_csv(filename)

Вуаля! 1 миллион твитов!

Нам понадобилось около 12 часов, чтобы спарсить миллион твитов, но это сработало! Вот готовый продукт, если вы хотите посмотреть, как выглядит вывод:

Ресурсы


Введение

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

Парсеры

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

Ниже приведены некоторые популярные парсеры:

  1. BeautifulSoup: Это библиотека Python, которая предоставляет удобный способ извлечения данных из HTML и XML файлов.
from bs4 import BeautifulSoup

# Создание объекта BeautifulSoup
soup = BeautifulSoup(html_doc, 'html.parser')

# Извлечение данных
title = soup.title.string
  1. lxml: Это библиотека Python для обработки XML и HTML документов. Она предоставляет более быстрый и эффективный способ парсинга данных.
from lxml import etree

# Создание объекта ElementTree
tree = etree.parse('file.xml')

# Извлечение данных
root = tree.getroot()
  1. Scrapy: Это фреймворк Python для парсинга веб-страниц. Он предоставляет мощные инструменты для извлечения данных с веб-сайтов и автоматизации этого процесса.
import scrapy

class MySpider(scrapy.Spider):
    name = 'myspider'

    def start_requests(self):
        # Определение URL-адреса для парсинга
        urls = ['http://example.com']
        for url in urls:
            yield scrapy.Request(url=url, callback=self.parse)

    def parse(self, response):
        # Извлечение данных
        data = response.css('div.content').extract()

Заключение

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