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.

195 lines
10 KiB
Markdown

3 years ago
# Лабораторная работа 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'])
3 years ago
with open(r" wall_asp.json", 'a') as f:
f.write(json.dumps(wall))
3 years ago
if __name__ == '__main__':
main()
```
3 years ago
В файле `wall_asp.json` будет находиться дамп всех сообщений на стене выбранного сообщества (в нашем примере, группа [«Аспирантов Самарского университета»](https://vk.com/ssau_asp)). Можно увидеть, в полученном файле достаточно много непонятных слов и цифр. Это различные служебные и информационные поля. В них содержится информация о том, когда был сделан пост, кем, сколько лайков, сколько комментариев и многое.
Для изучения `json` из терминала удобным инструментом является https://www.visidata.org/, который может быть установлен командой `pip install visidata`.
3 years ago
У 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"
3 years ago
GEOBOX_SAMARA_BIG = [48.9700523344,52.7652295668,50.7251182524,53.6648329274]
3 years ago
class MyStreamListener(tweepy.StreamListener):
def on_status(self, status):
3 years ago
with open('messages.txt' , 'a') as f:
f.write ("@{}, сообщение номер {}\n {}\n".format(
status.author.screen_name,
status.id_str,
status.text)
)
3 years ago
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
3 years ago
def monitoring_tweets(api, query="", locations=None):
3 years ago
myStreamListener = MyStreamListener()
myStream = tweepy.Stream(
auth = api.auth,
listener=myStreamListener
)
3 years ago
myStream.filter(track=[query], locations=locations)
3 years ago
if __name__ == '__main__':
while True:
try:
auth = tweepy.OAuthHandler(API_KEY, API_SECRET)
auth.set_access_token(ACCESS_TOKEN, ACCESS_TOKEN_SECRET)
api = tweepy.API(auth)
3 years ago
monitoring_tweets(api, query="", locations=GEOBOX_SAMARA_BIG)
3 years ago
except Exception as error_msg:
print (error_msg)
```
Данный код обращается к серверам Twitter с запросом всех сообщений, у которых точка отправки сообщения находится в пределах указанного геобокса (`GEOBOX_SAMARA_BIG`).
3 years ago
Подробнее о StreamingAPI можно почитать здесь (https://developer.twitter.com/en/docs/tutorials/consuming-streaming-data.html).