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.

196 lines
10 KiB
Markdown

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

# Лабораторная работа 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).