Анализ Twitter аккаунтов русских троллей в предвыборной компании Трампа

автор

На прошлой неделе, как результат расследования Комитета по Анализу Палаты Представителей, Твиттер выложил список из 2752 аккаунтов, связанных с Российским Агентством Интернет-исследований, которые были связаны с распространением фейковых новостей, в основном направленных на то, чтобы оказать влияние на выборы 2016 года. В данной статье мы рассмотрим, как разделять твиты пользовательских страниц, размещенных с кешированных версий этих страниц (т.к. Twitter заблокировал все аккаунты), с последующим импортом в Neo4j для анализа. Также мы научимся создавать простой интерфейс GraphQL для показа этих данных через GraphQL.

Содержимое:

  1. Русские Тролли в Твиттере
  2. Архив Интернета (Internet Archive)
  3. Поиск Доступных Кэшированных Страниц
  4. Очистка Профилей в Твиттере
  5. Импорт В Neo4j
  6. Графические Запросы
  7. Основные хештеги
  8. Самые популярные хештеги
  9. Топ использованных доменов
  10. Интерфейс GraphQL
  11. React приложение
  12. Подробнее о фабрики троллей (ВИДЕО)
  13. Подведем Итоги

 

Русские Тролли в Твиттере

Когда представители Твиттера выкладывали список имен и id пользователей, они при этом не предоставили никакой информации (такой как конкретные твиты и количество фолловеров), связанной с этими аккаунтами. Фактически, Твиттер заблокировал эти аккаунты, а это значит, что выложенные твиты удалены с Twitter.com и больше не являются доступными в Twitter API. Анализ этих твитов, выложенных из перечисленных аккаунтов – это первый шаг в понимании того, как аккаунты, управляемые с территории Российской Федерации, повлияли на выборы в США. Так что наш первый шаг – это найти потенциальные источники данных.

Архив Интернета (Internet Archive)

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

К примеру, если вы перейдете по ссылке http://web.archive.org/web/20170818065026/https:/twitter.com/TEN_GOP, то увидите страницу Твиттера @TEN_GOP, аккаунт одного из троллей, который был создан для имитации аккаунта Республиканской партии в Теннеси.

На этом скрине видно несколько последних твитов @TEN_GOP

Поиск Доступных Кэшированных Страниц

Используя перечисленные названия аккаунтов, предоставленных Комитетом Палаты Представителей, мы можем использовать интерфейс Wayback в archive.org, чтобы выяснить, была ли кэширована страница профиля в интернет архиве хотя бы раз. Мы напишем простой скрипт в Python для итерации через список аккаунтов троллей, и проверки в Wayback на наличие доступных кэшированных страниц.

Мы можем сделать это, выполнив запрос:

Так мы получим url и timestamp каждого созданного кэша, если таковые имеются. Далее мы выполняем итерацию через список аккаунтов, с последующей проверкой в Wayback на наличие доступных кэшей.

В результате мы получаем файл twitter_handle_urls.csv, который содержит список ссылок на аккаунты троллей, предоставленных archive.org. К сожалению, было найдено только около сотни аккаунтов, которые были кэшированы в этом архиве. Это лишь малая доля от всего списка, но мы все еще можем очистить твиты этих 100 пользователей.

Очистка Профилей в Твиттере

Теперь мы готовы к очистке HTML от кэш данных интернет архива, чтобы извлечь весь контент, связанный с твиттером. Для этого мы используем пакет BeautifulSoup от Python, который поможет нам извлечь данные Твиттера из HTML. Для начала, используем devtools в Chrome для проверки структуры HTML, и выясним, какие элементы содержат необходимые нам данные:

 

Так как кэш был взят в разные отрезки времени, структура HTML также может быть другой. Нам нужно написать код, который может обрабатывать парсинг разных форматов. Мы нашли две версии аккаунтов в Твиттере в кэшах. Один датируется 2015 годом, другой – 2016-2017.

Пример кода для очистки данных для одной из версий:

BeautifulSoup позволяет нам выбирать элементы HTML по определенным атрибутам для сопоставления. Проверив структуру HTML страницы, мы можем заметить, какие куски твитов размещены в разных HTML элементах, их то мы и соберем при помощи BeautifulSoup. Мы создадим массив твит-объектов также, как мы парсировали все твиты на странице

После того, как мы извлекли все твиты, мы можем вписать их в файл json:

В итоге мы находим примерно 1500 твитов с 187 аккаунтов в Твиттере. Это только маленькая часть всего массива твитов, выложенных троллями. В то же время, такое количество – слишком много. Вычитывать каждый твит самостоятельно займет очень много времени. Мы используем графическую базу данных Neo4j, которая поможет нам понять предоставленные данные. При помощи Neo4j, мы будем в состоянии задавать такие вопросы, как:

  1. Какие хештеги используются чаще всего?
  2. Какие домены в URL используются при упоминании Трампа?

Импорт В Neo4j

Теперь, так как мы имеем нашу чистую базу данных, мы можем вложить её в Neo4j. Существует несколько способов для импорта данных в Neo4j. Мы выполняем импорт путем загрузки данных JSON и передачи их в качестве параметра для запроса Cypher. Для этого используем драйвер Python для Neo4j. Мы используем простую модель графических данных, после этого обрабатываем хештеги и ссылки в качестве узлов в графике, таким же образом обрабатываем твиты и пользователя, который их постил.

Модель данных

Графические Запросы

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

Интересные Запросы

Полная картинка: https://python-scripts.com/wp-content/uploads/2017/11/ten_gop_tweets.png

Основные хештеги

  • «JugendmitMerkel» — 90
  • «TagderJugend» — 89
  • «politics» — 61
  • «news» — 30
  • «sports» — 28
  • «Merkel» — 26
  • «ColumbianChemicals» — 25
  • «WorldElephantDay» — 22
  • «crime» — 21
  • «UnitedStatesIn3Words» — 21

Самые популярные хештеги

  1. «JugendmitMerkel«, «TagderJugend» — 89
  2. «TagderJugend«, «WorldElephantDay» — 22
  3. «JugendmitMerkel«, «WorldElephantDay» — 22
  4. «JugendmitMerkel«, «Dschungelkönig» — 21
  5. «TagderJugend«, «Dschungelkönig» — 21
  6. «Merkel«, «JugendmitMerkel» — 17
  7. «Merkel«, «TagderJugend» — 17
  8. «CDU«, «JugendmitMerkel» — 12
  9. «CDU«, «TagderJugend» — 12
  10. «TagderJugend«, «Thailand» — 11

Топ использованных доменов

В простонародье «пруфы» на которые ссылались ссылкой тролли.

  1. pic.twitter.com — 835
  2. bit.ly120
  3. pbs.twimg.com100
  4. vk.com32
  5. riafan.ru21
  6. inforeactor.ru21
  7. nevnov.ru20
  8. goodspb.livejournal.com17
  9. www.fox5atlanta.com15

Интерфейс GraphQL

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

Для начала, нам потребуется схема GraphQL.

Наша схема GraphQL определяет типы и доступные поля в данных, а также точки доступа для GraphQL. В данном случае, в качестве простой точки входа мы используем Hashtag, что позволяет нам искать твиты по хештегу.

При помощи интеграции neo4j-graphql-js, схема GraphQL сопоставляет графическую модель базы данных и переводит любой произвольный запрос GraphQL в Cypher, позволяя кому угодно запрашивать данные через интерфейс GraphQL без написания Cypher.

Запуск сервера GraphQL – это всего лишь передача запроса GraphQL к функции, находящейся в resolver.

 

Ссылка на полный размер: https://python-scripts.com/wp-content/uploads/2017/11/graphiql.png

React приложение

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

Здесь мы ищем твиты по запросу #crime и видим, что тролль @OnlineCleveland твитит новости о преступлениях в Огайо, акцентируя на том, что больше всего преступлений происходит именно в Кливленде. Зачем троллю из России твитить о преступлениях в Кливленде аккурат перед выборами? Потому что, когда электорат выбирает политика, который особенно жестко борется с криминалом, он выбирает кого-либо из Республиканской партии…

Подробнее о фабрики троллей

Подведем Итоги

В данной статье мы отсортировали и структурировали данные твиттера при помощи Internet Archive, выполнили импорт этих данных в Neo4j для анализа, создали интерфейс GraphQL для отображения данных и простое GRANDstack-приложение, которое позволяет любому быстро найти твиты по хештегу.

Несмотря на то, что мы можем найти только малую долю твитов, которые разместили тролли из российских аккаунтов, мы продолжим поиски способов добычи данных. 😉

Вам может быть интересно

  • Вася Вася

    А где связь между трампом и JugendmitMerkel!?)) очередная чушь