|
|
# Лабораторная работа 1. «Сбор данных социальных сетей»
|
|
|
|
|
|
[назад](README.md)
|
|
|
|
|
|
В целях практического применения описанных в пособии сведений, а также овладения существующим инструментарием в области анализа социальных сетей в данном учебном пособии авторами приводятся следующие четыре лабораторные работы.
|
|
|
|
|
|
При выполнении данной лабораторной работы приобретаются навыки взаимодействия с открытыми API социальных сетей VKонтакте и Twitter.
|
|
|
|
|
|
Для выполнения данной лабораторной работы необходимы аккаунты в этих социальных сетях.
|
|
|
|
|
|
## 1. Инсталляция и настройка Python окружения
|
|
|
Лабораторная работа выполняется с использованием языка программирования Python. В случае отсутствия данного программного обеспечения на компьютере необходимо перейти на
|
|
|
официальный сайт и скачать последнюю версию Python. Далее установить Python на компьютер, следуя указаниям мастера установки.
|
|
|
|
|
|
Для выполнения также необходимы пакеты `vk_api` и `tweepy`. Для установки этих пакетов необходимо выполнить в командной строке с правами администратора команду вида:
|
|
|
```
|
|
|
pip install <имя_пакета>
|
|
|
```
|
|
|
## 2. Подключение к социальной сети VK
|
|
|
|
|
|
Необходимо открыть Python Shell и запустить к исполнению следующий код.
|
|
|
|
|
|
```python
|
|
|
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!».
|
|
|
|
|
|
Далее можно попробовать скачать все посты (записи) на странице сообщества. Для этого нужно выбрать произвольное сообщество (к примеру, группу [«Аспирантов Самарского университета»](https://vk.com/ssau_asp)) и выполнить следующий код:
|
|
|
|
|
|
```python
|
|
|
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` будет находиться дамп всех сообщений на стене выбранного сообщества (в нашем примере, группа [«Аспирантов Самарского университета»](https://vk.com/ssau_asp)). Можно увидеть, в полученном файле достаточно много непонятных слов и цифр. Это различные служебные и информационные поля. В них содержится информация о том, когда был сделан пост, кем, сколько лайков, сколько комментариев и многое.
|
|
|
|
|
|
Для изучения `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](images/2021-09-04_16-19-31.png)
|
|
|
Рис. 29. Создание приложения по подключению к Twitter API
|
|
|
|
|
|
Затем следует подключиться к социальной сети Twitter и запросить информацию о количестве подписчиков пользователя данной сети.
|
|
|
|
|
|
```python
|
|
|
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` – это отображаемое имя и количество тех, кто подписался на данного пользователя.
|
|
|
|
|
|
Далее попробуем что-либо написать на своей странице. Для этого запустим на исполнение следующий код:
|
|
|
|
|
|
```python
|
|
|
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. Вывод сообщения в результате исполнения кода](images/2021-09-04_16-22-12.png)
|
|
|
Рис. 30. Вывод сообщения в результате исполнения кода
|
|
|
|
|
|
Подробнее про Twitter API можно прочитать по ссылке (https://developer.twitter.com/en/docs/api-reference-index).
|
|
|
|
|
|
Для сбора данных подключимся к StreamingaAPI следующим образом.
|
|
|
```python
|
|
|
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).
|