You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

10 KiB

Лабораторная работа 1. «Сбор данных социальных сетей»

назад

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

При выполнении данной лабораторной работы приобретаются навыки взаимодействия с открытыми API социальных сетей VKонтакте и Twitter.

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

1. Инсталляция и настройка Python окружения

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

Для выполнения также необходимы пакеты vk_api и tweepy. Для установки этих пакетов необходимо выполнить в командной строке с правами администратора команду вида:

pip install <имя_пакета>

2. Подключение к социальной сети VK

Необходимо открыть Python Shell и запустить к исполнению следующий код.

import vk_api

def auth_handler():
  """ При двухфакторной аутентификации вызывается
эта функция.
"""
  # Код двухфакторной аутентификации
  key = input("Enter authentication code: ")
  # Если: True - сохранить, False - не сохранять.
  remember_device = True
  return key, remember_device

def stop_f(items):
  print (items)
    
def main():
  login, password = '<ВАШ ЛОГИН>', '<ВАШ ПАРОЛЬ>'
  vk_session = vk_api.VkApi(
    login, password,
    auth_handler=auth_handler  # функция для обработки двухфакторной аутентификации
  )

  try:
      vk_session.auth()
  except vk_api.AuthError as error_msg:
      print(error_msg)

  tools = vk_api.VkTools(vk_session)
  vk_app = vk_session.get_api()
  print(vk_app.wall.post(message='Hello world!'))

if __name__ == '__main__':
  main()

Этот код отправит запрос на авторизацию в VK (для получения доступа к Вашей учётной записи) и опубликует на Вашей странице запись от Вашего имени с содержанием «Hello world!».

Далее можно попробовать скачать все посты (записи) на странице сообщества. Для этого нужно выбрать произвольное сообщество (к примеру, группу «Аспирантов Самарского университета») и выполнить следующий код:

import vk_api
import json
group_id = -43938013

def main():
  """ Пример получения всех постов со стены """
  login, password = '<ВАШ ЛОГИН>', '<ВАШ ПАРОЛЬ>'
  vk_session = vk_api.VkApi(login, password)
  try:
      vk_session.auth(token_only=True)
  except vk_api.AuthError as error_msg:
      print(error_msg)
      return
  tools = vk_api.VkTools(vk_session)
  wall = tools.get_all('wall.get', 100,
{'owner_id': group_id})
  print('Posts count:', wall['count'])
  with open(r" wall_asp.json", 'a') as f:
    f.write(json.dumps(wall))
  
if __name__ == '__main__':
  main()

В файле wall_asp.json будет находиться дамп всех сообщений на стене выбранного сообщества (в нашем примере, группа «Аспирантов Самарского университета»). Можно увидеть, в полученном файле достаточно много непонятных слов и цифр. Это различные служебные и информационные поля. В них содержится информация о том, когда был сделан пост, кем, сколько лайков, сколько комментариев и многое.

Для изучения json из терминала удобным инструментом является https://www.visidata.org/, который может быть установлен командой pip install visidata.

У Api социальной сети VKонтакте много возможностей. Подробнее о них можно прочитать на странице документации (https://vk.com/dev/manuals).

3. Подключение к социальной сети Twitter

Алгоритм подключения к Twitter практически не отличается от подключения к социальной сети VKонтакте.

Для начала необходимо получить секретный токен. Для этого нужно перейти по ссылке (https://developer.twitter.com/en/apps) и нажать кнопку Create an app. После ввода всех требуемых данных, приложение сгенерирует API key и API key (рис. 29). Также стоит поменять права доступа приложения на чтение и запись.

Рис. 29. Создание приложения по подключению к Twitter API
Рис. 29. Создание приложения по подключению к Twitter API

Затем следует подключиться к социальной сети Twitter и запросить информацию о количестве подписчиков пользователя данной сети.

import tweepy
API_KEY = "YOUR_API_KEY"
API_SECRET = "YOUR_API_SECRET"
ACCESS_TOKEN = "YOUR_ACCESS_TOKEN"
ACCESS_TOKEN_SECRET = "YOUR_ACCESS_TOKEN_SECRET"
auth = tweepy.OAuthHandler(API_KEY, API_SECRET)
auth.set_access_token(ACCESS_TOKEN,
ACCESS_TOKEN_SECRET)
api = tweepy.API(auth)
user = api.get_user('twitter')
print(user.screen_name, user.followers_count)

Данный код вызывает метод API, который называется get_user и возвращает информацию о пользователе, имя которого мы указали (в примере 'twitter'). Можно указать другое имя (своё, например) и посмотреть результат. Затем нужно вывести user.screen_name и user.followers_count это отображаемое имя и количество тех, кто подписался на данного пользователя.

Далее попробуем что-либо написать на своей странице. Для этого запустим на исполнение следующий код:

import tweepy
API_KEY = "YOUR_API_KEY"
API_SECRET = "YOUR_API_SECRET"
ACCESS_TOKEN = "YOUR_ACCESS_TOKEN"
ACCESS_TOKEN_SECRET = "YOUR_ACCESS_TOKEN_SECRET"
auth = tweepy.OAuthHandler(API_KEY, API_SECRET)
auth.set_access_token(ACCESS_TOKEN,
ACCESS_TOKEN_SECRET)
api = tweepy.API(auth)
api.update_status('Просто так твит ни о чём!')

В результате получается следующее (рис. 30).

Рис. 30. Вывод сообщения в результате исполнения кода
Рис. 30. Вывод сообщения в результате исполнения кода

Подробнее про Twitter API можно прочитать по ссылке (https://developer.twitter.com/en/docs/api-reference-index).

Для сбора данных подключимся к StreamingaAPI следующим образом.

import tweepy

API_KEY = "YOUR_API_KEY"
API_SECRET = "YOUR_API_SECRET"
ACCESS_TOKEN = "YOUR_ACCESS_TOKEN"
ACCESS_TOKEN_SECRET = "YOUR_ACCESS_TOKEN_SECRET"

class MyStreamListener(tweepy.StreamListener):
  def on_status(self, status):
    with open('messages.txt' , 'a') as f:
      f.write ("@{}, сообщение номер {}\n {}\n".format(
        status.author.screen_name,
        status.id_str,
        status.text)
      )
    
    print("@{}, сообщение номер {}\n {}\n".format(
      status.author.screen_name,
      status.id_str,
      status.text)
    )

  def on_error(self, status_code):
    if status_code == 420:
      return False

def monitoring_samara_tweets(api, query=""):
  GEOBOX_SAMARA_BIG = [48.9700523344,52.7652295668,50.7251182524,53.6648329274]
  myStreamListener = MyStreamListener()
  myStream = tweepy.Stream(
    auth = api.auth,
    listener=myStreamListener
  )
  myStream.filter(locations=GEOBOX_SAMARA_BIG)

if __name__ == '__main__':
  query = [" "]
  while True:
    try:
      auth = tweepy.OAuthHandler(API_KEY, API_SECRET)
      auth.set_access_token(ACCESS_TOKEN, ACCESS_TOKEN_SECRET)
      api = tweepy.API(auth)
      monitoring_samara_tweets(api, query)
    except Exception as error_msg:
      print (error_msg)

Данный код обращается к серверам Twitter с запросом всех сообщений, у которых точка отправки сообщения находится в пределах указанного геобокса (GEOBOX_SAMARA_BIG).

Подробнее о StreamingAPI можно почитать здесь (https://developer.twitter.com/en/docs/tutorials/consuming-streaming-data.html).