CoderCastrov logo
CoderCastrov
Социальная сеть

Анализ социальной сети в Twitter с использованием Python

Анализ социальной сети в Twitter с использованием Python
просмотров
2 мин чтение
#Социальная сеть

Часть 1: парсинг данных Twitter без использования Twitter API (с использованием snscrape)

Обновление 23 августа 2023 года: К сожалению, Twitter заблокировал возможность выполнения поиска или доступа к расширенному поиску для пользователей без входа в систему, поэтому сегодня никто не может выполнять парсинг данных Twitter без входа в систему (аналогично другим инструментам, таким как twint и т. д.). Я обновлю информацию позже, если появится новый способ.

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

Сначала нам нужно установить пакет snscrape. Для тех, кто хочет установить пакет, следуя этому руководству, вы можете посетить https://pypi.org/project/snscrape/ и прочитать документацию здесь

GitHub - JustAnotherArchivist/snscrape: Парсер социальных сетей на Python

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

github.com

Затем мы начинаем писать код. Сначала импортируем все необходимые библиотеки.

import snscrape.modules.twitter as sntwitter
import pandas as pd
import numpy as np
import re

Давайте соберем данные о твитах с помощью этого кода и сохраняем данные в таблицу данных с именем df.

query = '"Ferdy Sambo" lang:id' # это ключевое слово
limit = 10000 # общее количество твитов, которое мы хотим собрать
tweets = []
try:
    print('Начало сбора данных')
    for tweet in sntwitter.TwitterSearchScraper(query=query).get_items():
        if len(tweets) == limit:
            break
        else:
            if tweet.inReplyToUser is not None:
                tweet_type = 'ответ'
                tweet_reply = re.findall(r'[/]\w+', str(tweet.inReplyToUser))[-1].replace('/','')
            elif tweet.quotedTweet is not None:
                tweet_type = 'ретвит'
                tweet_reply = None
            else:
                tweet_type = 'оригинал'
                tweet_reply = None
            tweets.append([tweet.conversationId,
                           tweet.coordinates,
                           tweet.date,
                           tweet.hashtags,
                           tweet.id,
                           tweet.inReplyToTweetId,
                           tweet.inReplyToUser,
                           tweet_reply,
                           tweet.lang,
                           tweet.likeCount,
                           tweet.media,
                           tweet.mentionedUsers,
                           tweet.outlinks,
                           tweet.place,
                           tweet.quoteCount,
                           tweet.quotedTweet,
                           tweet.renderedContent,
                           tweet_type,
                           tweet.replyCount,
                           tweet.retweetCount,
                           tweet.retweetedTweet,
                           tweet.sourceLabel,
                           tweet.url,
                           tweet.user,
                           tweet.user.username])
    df = pd.DataFrame(tweets, columns=(['conversationId',
                                        'coordinates',
                                        'date',
                                        'hashtags',
                                        'id',
                                        'inReplyToTweetId',
                                        'inReplyToUser_url',
                                        'inReplyToUser',
                                        'lang',
                                        'likeCount',
                                        'media',
                                        'mentionedUsers',
                                        'outlinks',
                                        'place',
                                        'quoteCount',
                                        'quotedTweet',
                                        'description',
                                        'tweet_type',
                                        'replyCount',
                                        'retweetCount',
                                        'retweetedTweet',
                                        'source',
                                        'tweet_url',
                                        'user_url',
                                        'username']))
except Exception as e:
    print(e)
    
print('Завершено')
print('-----')

после завершения процесса сбора данных, мы получим набор данных с именем df. Мы можем посмотреть на файл df, используя df.head().

Затем мы извлечем данные о твитах только с типом 'ответ'.

df_reply = df[['inReplyToUser','username']][df['tweet_type'] == 'ответ']# Сортируем случаи с a->b и b->a
relationship_df = pd.DataFrame(np.sort(df_reply.values, axis = 1), columns = ['от','кому'])
relationship_df

Создаем новый столбец с названием 'value'. Группируем данные по столбцам 'от' и 'кому'. Это означает, что каждый раз, когда есть одинаковые данные, мы будем их собирать, а общее количество одинаковых данных будет видно с помощью функции суммирования в столбце 'value'.

relationship_df["value"] = 1
relationship_df = relationship_df.groupby(["от","кому"], sort=False, as_index=False).sum()relationship_df() #смотрим данные

Наконец, мы сохраняем эти данные в csv-файл с именем 'relation_tweet.csv'.

relationship_df.to_csv('relation_tweet.csv', index=False)

В следующем посте мы будем использовать csv-файл для визуализации сети, образованной из ответов на твиты.