Предисловие
Доброго времени суток дорогой читатель. Недавно мы с командой при поддержке JetBrains разыграли 2 ключа на годовую лицензию Pycharm Professional в нашей официальной группе Вконтакте «Happy Python». Чтобы получить больший охват нашего розыгрыша, мы провели рекламную компанию через сторонние паблики.
Столкнулись с огромным количеством групп, где можно распространить свой розыгрыш но огромный минус всех их — это очень высокие цены.
По незнанию приобрели рекламу с очень слабым откликом. Группа в которой размещался наш пост, при численности участников в 200 000 человек, набрал около 2000 просмотров. Что нас конечно же расстроило.
Всё это меня навело на мысль, написать анализатор групп Вконтакте, то есть проверять сколько из участников действительно живы и активны, ведь именно они нам интересны, как целевая аудитория рекламной компании И решили мы изучить теорию как происходит анализ данных, какие сведения нам нужны и насколько сложно их получить. А по нашей ссылке вы можете изучить курс Анализ данных на Python по 40% скидке. Действительно стоящий материал, который сложно найти в открытом доступе. Рекомендуем.
Исходный код доступен на GitHub. Вопросы по коду задать в нашем Telegram чате.
Импорт используемых библиотек для работы с ВК
Начнем написание кода с импорта нужных нам библиотек. Установим requests командой pip install requests, все остальные библиотеки являются стандартными и идут с python из упаковки, нам остается их только импортировать.
from config import token — данный импорт из файла config.py расположенного в данной рабочей директории, это ваш токен, которые вы должны получить в Вконтакте, если конечно у вас его еще нет. Если будут трудности, пишите в нашу группу VK HappyPython или Telegram чат, Вам всегда помогут.
import requests
import time
from config import token
import datetime
Получаем количество смещений по количеству подписчиков в целевой группе ВК
Теперь нам надо выявить количество смещений (offset) в группе. Это нам нужно для того, чтобы собрать всех пользователей группы, если их больше 1000, так как ВК, может выдать только по 1000 участников за раз.
def get_offset(group_id):
"""Выявляем параметр offset для групп, 1 смещение * 1000 id"""
params = {'access_token': token, 'group_id': group_id, 'v': 5.131}
r = requests.get('https://api.vk.com/method/groups.getMembers', params=params)
count = r.json()['response']['count']
print(f'Количество подписчиков: {count}')
if count > 1000:
return count // 1000
else:
count = 1
return count
Получение данных об активности подписчиков ВК группы
Данная функция на входе принимает id группы (group_id) и дату (from_data) с которой вы хотите начать анализ группы. Функция выведет нам количество пользователей со скрытой датой (список users_can_closed_visit), активных подписчиков (список active_list) плюс процентное соотношение с общим количеством участников и не активных подписчиков (список un_active_list)
def get_users(group_id, from_data):
"""Получаем всех участников группы и фильтруем их"""
active_list = []
users_can_closed_visit = []
un_active_list = []
for offset in range(0, get_offset(group_id) + 1):
params = {'access_token': token, 'v': 5.131, 'group_id': group_id, 'offset': offset*1000, 'fields': 'last_seen'}
users = requests.get('https://api.vk.com/method/groups.getMembers', params=params).json()['response']
for user in users['items']:
# проверка последнего посещения, не ранее указанной даты from_data преобразованной в timestamp
start_point_data = datetime.datetime.strptime(from_data, '%d.%m.%Y').timestamp()
try:
if user['last_seen']['time'] >= start_point_data:
active_list.append(user['id'])
else:
un_active_list.append(user['id'])
except:
users_can_closed_visit.append(user['id'])
print(f'Количество пользователей со скрытой датой: {len(users_can_closed_visit)}')
print(f"Активных подписчиков: {len(active_list)} ({round(len(active_list) / (users['count'] - len(un_active_list)) *100, 2)}%)")
print(f'Не активные подписчики: {len(un_active_list)}\n')
return active_list
Основная функция парсера ВК
Функция принимает список групп, проходится по ним, выводя в терминал подробную информацию.
def parser(group_list):
from_data = input('Введите дату, с которой хотите отслеживать активность\nв формате: дд.мм.гггг: ')
# from_data = '20.08.2022'
all_active_users = []
print(f'Анализируем с {from_data}\n')
for group in group_list:
print(f'Группа: {group}')
try:
users = get_users(group, from_data=from_data)
all_active_users.extend(users)
time.sleep(2)
except Exception as ex:
print(f'{group} - не предвиденная ошибка: {ex}\n')
continue
Запуск парсера групп ВК
Пропишем конструкцию if name == ‘main‘. И вызовим нашу основную функцию, передав в нее список групп, которые мы хотим проанализировать. Для примера я взял свою группу (при желании вы можете внести в список любое количество групп, как в за комментированном примере ).
if __name__ == '__main__':
# вносим в список интересующие вас группы
# group_list = ['happython', 'python_forum', 'vk_python', 'pirsipy']
group_list = ['happython']
parser(group_list)
После запуска кода, в терминале видим следующее (Рисунок 1):

Вводим дату с которой хотим проанализировать группу, я введу 20.08.2022, то есть буду выявлять тех, кто был онлайн за последние два месяца. Жмем enter и получаем результат (Рисунок 2):

И так, активность нашей группы на 20.09.2022 за последние два месяца составляет ~88%, что не может не радовать. ^_^.
Благодаря данному коду Вы можете отсортировать группы в которых стоит брать рекламу, а какие стоит обойти стороной, где раздутые не активные подписчики.
Подписывайтесь на Нас: Вконтакте и Telegram. А так же если Вас интересует Backend на Python рекомендую канал нашего партнера в Telegram Backend development 💻