Предисловие

Доброго времени суток дорогой читатель. Недавно мы с командой при поддержке 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):

Рисунок 1. взаимодействие с пользователем после запуска кода

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

Рисунок 2. Результат анализа группы HappyPython

И так, активность нашей группы на 20.09.2022 за последние два месяца составляет ~88%, что не может не радовать. ^_^.

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

Подписывайтесь на Нас: Вконтакте и Telegram. А так же если Вас интересует Backend на Python рекомендую канал нашего партнера в Telegram Backend development 💻