Как найти самые популярные посты вконтакте

😼

Выбор
редакции

17 мая 2019


10 959



В избр.
Сохранено

Как находить самые популярные посты конкурентов “ВКонтакте”

Долго я искал решение, чтобы сортировать посты “ВКонтакте” по разным критериям: лайки, репосты, комментарии. Но все, что находил, было платным или ограничивало функционал. Недавно нашел бесплатный сервис для поиска вирусного контента и хочу им поделиться.

Таким инструментом оказалось небольшое приложение Посты ВКонтакте. Приложение бесплатное, быстрое, удобное и продуманное.

Распишу подробную инструкцию работы с сервисом.

1. Выберите источники для отслеживания

Можно настроить аналитику на свое сообщество и находить вечнозеленый контент или искать классные посты конкурентов.

b_5cde88d85ed6f.jpg

2. Сортируем и выбираем нужный период

Результаты поиска можно отсортировать. Убывание лайков на 1 просмотр ставьте, когда в списке для анализа много пабликов с большим разбросом подписчиков, чтобы не потерять интересные посты от небольших сообществ.

b_5cde89c2760c8.jpg

В Spark я использую этот сервис для поиска вечнозеленого контента. Возможно, и у вас есть старые посты, которыми стоит еще раз поделиться с подписчиками.

Ссылка на сообщество или пользователя
Введите адрес вида https://vk.com/my_group_name или https://vk.com/my_user_name по 1 ссылке на строку

Просматриваем постов на стене

По какому параметру сортируем популярные посты?

Ищем посты

Собираем ТОП- популярных постов

Исключить закреплённый пост из работы скрипта?

бывают ситуации, когда закреплённый пост искажает результаты

Дата постов должна быть:
между и включительно

(если фильтр по дате не нужен, оставьте поля с датами пустыми)

(если указываете старые даты, то число просматриваемых постов укажите побольше, чтобы посты за нужные даты попали туда)



Размер отчёта ограничен, поскольку вы пользуетесь бесплатной версией сервиса.
Вы можете оплатить полный доступ к сервису за 349 руб/день или 899 руб/мес и получить полный отчёт без ограничений, а также неограниченный доступ ко всем скриптам сервиса

Результат работы модуля “Популярные посты” в Pro-версии:

1. В “Найдено” отображается общее число найденных постов за выбранный период времени.

2. При необходимости можно отфильтровать результаты по количеству активностей, указав, сколько лайков, репостов, комментариев должно быть у поста. А также по ключевым словам, которые должны/не должны содержаться в тексте поста, и по дате создания поста.

3.
Скачать результаты на компьютер:

  • ссылки на собранные посты в .txt-формате;
  • или подробные результаты в .csv-таблице.

4. По клику на кнопку “Выбрать” появится окно с возможностью выбрать первые N постов автоматически. 5. Результаты работы модуля:

  • ссылка на пост, при клике на нее пост откроется в новом окне;
  • общее количество лайков у данного поста;
  • общее количество репостов у данного поста;
  • общее количество комментариев у данного поста;
  • текст поста;
  • дата и время создания поста.

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

Результат работы модуля “Популярные посты” в VK Apps-версии:

1. Скачать результаты на компьютер:

  • ссылки на собранные посты в .txt-формате, для этого необходимо нажать “Сохранить ссылки”;
  • или подробные результаты в .csv-таблице, для этого нужно нажать “Сохранить CSV”.

2. В поле “Выбрать первые N результатов” можно указать количество сообществ, которые автоматически будут помечены для скачивания.

3. Результаты работы модуля:

  • текст поста, при клике на него пост откроется в новом окне;
  • общее количество лайков у данного поста;
  • общее количество репостов у данного поста;
  • общее количество комментариев у данного поста;
  • дата и время создания поста.

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

Если вы слышите слово «парсер», в голове обычно всплывает ассоциация с таргетированной рекламой. Да, в парсерах действительно можно находить тематические сообщества, настраивать автоимпорт новых подписчиков для настройки рекламы, применять фильтры, но мало кто знает, как использовать парсер для анализа своего сообщества.

Например, вы запустили рекламу и хотите проанализировать вступивших в вашу группу людей, узнать их пол, возраст место жительство и т. д. Или вы сделали рекламные посевы в нескольких группах и хотите увидеть сколько и откуда (из каких источников) людей вступило к вам.

В этой статье мы разберемся в способах применения парсеров для анализа своего сообщества ВКонтакте. Делать обзор будем на примере парсера Pepper.Ninja.

Как проанализировать ядро подписчиков и узнать, какие паблики они любят

Как узнать сколько людей регулярно взаимодействует с вашей группой и кто они? Человек может регулярно заходить в группу, читать все посты, но никак не показывать свой интерес. В этом случае найти заинтересованных подписчиков поможет анализ топа подписок.

Итак, все подписки человека формируются в порядке частоты взаимодействия с сообществом. Постоянные переходы в группы или частая активность в них поднимут паблик в топе подписок. Чтобы посмотреть самые популярные группы у ваших подписчиков, зайдите в «Быстрый парсинг», вставьте ссылку на страницу и выберите «Пользователи – Сообщества».

«Быстрый парсинг» – это «волшебная» кнопка, куда можно вставить любую ссылку из ВКонтакте и парсер сам покажет, что из нее можно собрать. Например, с помощью нее можно искать посты по ключам, парсить по ГЕО – все находится в одном месте и не обязательно переходить по вкладкам меню Pepper.Ninja.

Например, проанализируем топ-5 подписок группы о вышивании.

Как настроить сбор статистики по топам сообществ у подписчиков

После завершения анализа вы получите список самых популярных групп у аудитории, а в графе ЦА будет указано, у скольких людей группа находится в топе.

Для более точного анализа – примените фильтр по числу подписчиков сообщества и исключите группы с аудиторией более 500 тысяч. Так вы исключите группы о новинках кино, музыки и другие паблики, в которых может состоять практически любой человек.

В итоге вы сможете узнать, сколько людей чаще всего взаимодействуют с вашим контентом и на каких конкурентов подписаны. Это поможет как при настройке таргета, так и при проработке контент-стратегии.

Результат анализа по топу сообществ

Отдельно можно получить список подписчиков, у которых ваша группа находится в топе подписок. Это поможет получить портрет заинтересованной аудитории, узнать ее пол, возраст, ГЕО и многое другое.

Для поиска таких людей перейдите в «Быстрый парсинг», вставьте ссылку на страницу и выберите «Пользователи – Топ». Дополнительно можно применить фильтры к аудитории, например, посмотреть число учащихся или тех, кто указал информацию о детях в профиле.

Настройка фильтра

Еще один вариант использования этого инструмента – создать сбор новых участников группы в «Мониторинге общества» и, например, раз в неделю изучать в каких пабликах состоят новые подписчики.

Наконец, если вы разместили посевы в нескольких группах, то сможете получить список недавно вступивших, проанализировать их подписки и посчитать сколько людей и из какого сообщества пришло. Полезно для выбора оптимальной рекламной стратегии и составления отчета.

Как узнать активность каждого подписчика

Если вам интересно посмотреть активность конкретного человека, в этом случае вы сможете посмотреть подробный отчет за любые даты. Пригодится, если вы проводите конкурс активности и хотите найти участника с большим числом комментариев или просто получить статистику по каждому человеку.

Зайдите в «Быстрый парсинг», вставьте ссылку на сообщество и выберите раздел «Пользователи – Активных», укажите период сбора активности и их число. Если хотите получить подробный отчет по всем – задайте от 1 активности.

Затем активируйте «Аналитику активных пользователей».

Настройка поиска активных людей в сообществе

В разделе «Задания» появится число найденной аудитории, а также кнопка отчета.

Собранный отчет

В отчете можно сортировать людей по числу лайков, репостов (доступно для админов группы), комментариев или сумме активностей, а самая правая кнопка откроет список постов, в которых человек совершил активность.

Статистика действий собранной аудитории

Дополнительно вы сможете применить фильтры и оставить людей, поставивших определенное число лайков, исключить профили без аватара и многое другое.

Фильтр позволит отсеять собранную аудиторию более точно

Если вы награждаете самых активных комментаторов сообщества призами (не используете продвинутую геймификацию) и используете парсер при поиске аудитории для таргета, то с использованием Pepper.Ninja, вам не придется искать отдельный сервис для выявления самых активных пользователей. Обе задачи можно решать прямо здесь.

Как узнать больше информации о подписчиках других пабликов

В Pepper.Ninja можно проанализировать подписчиков любого сообщества. Сделать это можно двумя способами.

Способ 1. Выбираем инструмент «Аналитика ретаргета и сообществ». Он работает для групп от 2 000 подписчиков и получает аналитику прямо из рекламного кабинета.

Визуализация статистики из рекламного кабинета

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

Список интересов подписчиков из проанализированной группы

Способ 2. Собираем подписчиков группы (можно через «Быстрый парсинг») и запускаем аналитику найденной аудитории. Ее можно применить к любой собранной базе, будь то просто сбор всех участников групп или сбор людей, проявивших активность в постах; недавно вступивших в группу и т. д.

Помимо основных показателей, здесь можно посмотреть и музыкальные предпочтения (будут показаны песни, добавленные вашей аудиторией). Если вы добавляете музыку в посты, то сможете изучить любимые треки подписчиков и подбирать музыку, которая будет пересекаться с интересами участников группы.

Просмотр популярных треков у проанализированной группы

Как найти самые популярные посты, отсортировать их по просмотрам и активностям

Допустим, вы публикуете один пост в день и по итогам месяца хотите посмотреть отчет по активности аудитории в постах. Полученная информация пригодится в будущем, чтобы сделать акцент на рубриках, которые лучше заходят у аудитории и посмотреть записи, которые привлекают меньше внимания.

Поиск лучших постов в сообществе

Итак, для поиска постов вставьте ссылку на группу в быстрый парсинг и выберите «Посты – Популярные посты», если надо найти хештег, то укажите его в поле для ключевых слов, например #мпстудия . Потом выберите даты для поиска постов, можно задать фильтры по типу вложения и ключевым словам в посте, но их можно применить и при просмотре результатов.

Фильтрация поиска

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

Найденный пост

Как узнать больше о зрителях прямых эфиров

Если вы проводите прямые трансляции, то Pepper.Ninja поможет изучить ваших зрителей, узнать сколько минут человек смотрел эфир, какого он пола и возраста. Достаточно вставить ссылку в «Парсер трансляций» и активировать «Мониторинг трансляций» (он будет собирать зрителей эфира каждую минуту), без выбора этого пункта найдутся зрители, смотрящие прямо сейчас.

Настройка парсера для зрителей прямых эфиров

После завершения эфира вы получите список зрителей, сможете применить к ним фильтрацию и сортировку по длительности просмотра. Например, увидеть число людей, смотревших более половины эфира.

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

Список активных зрителей на трансляции

Используя Pepper.Ninja вы сможете не только собирать аудиторию для настройки таргетированной рекламы, но и анализировать участников вашей группы, узнавать их интересы, вовлеченность и многое другое. Пользуйтесь и применяйте все доступные функции для более качественной работы с контентом, рекламой и статистикой.

Недавно мне понадобилось получить отсортированный по лайкам или репостам список записей со страницы в VK. Готового решения я не нашел, пришлось решать задачу самостоятельно. В итоге получилось простенькое приложение, работающее достаточно быстро.

Требования к приложению заключались в следующем. На вход подается ссылка на страницу и дополнительные параметры. Сперва был только один параметр — ключ сортировки, позже был добавлен параметр, задающий промежуток времени (в днях). Посты, опубликованные раньше этого промежутка, не учитываются. Например, при значении параметра 7 на выходе получим список постов с максимальным количеством лайков (или репостов) за поледнюю неделю.

Для решения задачи использовал Python 3 и модуль Requests. Некоторые детали реализации не описываются, полный код доступен по ссылке, в конце статьи. Итак, приступим.

Для начала нужно распарсить аргументы командной строки. Для этого воспользуемся модулем argparse из стандартной библиотеки:

parse_args

def parse_args():
    """ Parses input arguments """
    parser = argparse.ArgumentParser()
    parser.add_argument('url',
                        action='store',
                        default=None,
                        help='target page',
                        type=url_validator)
    compar_key = parser.add_mutually_exclusive_group()
    compar_key.add_argument('-l',
                            '--likes',
                            help='sort posts by likes',
                            action='store_true',
                            default=True)
    compar_key.add_argument('-r',
                            '--reposts',
                            help='sort posts by reposts',
                            action='store_true')

    parser.add_argument('-t',
                        '--top',
                        help='number of showing posts.',
                        default=10,
                        type=num_validator)

    parser.add_argument('-d',
                        '--days',
                        type=int,
                        default=-1,
                        help='period for post processing.')
    return parser.parse_args()

Для проверки введенного url используется функция url_validator, которая, в случае успеха, возвращает словарь, содержащий тип введенного url и идентификатора страницы:

url_validator

def url_validator(arg):
    """ Checks correctness of url argument """
    arg = arg.lower()

    # If url something like https://vk.com/textual_id
    matched_txt_id = const.TXT_ID_REGEXP.match(arg)
    if matched_txt_id:
        url = matched_txt_id.groupdict()
        url['type'] = 'symbolic'
        return url

    # If url something like https://vk.com/id123456
    matched_numeric_id = const.NUM_ID_REGEXP.match(arg)
    if matched_numeric_id:
        return matched_numeric_id.groupdict()

    raise argparse.ArgumentTypeError(
            const.INVALID_URL.format(url=arg))

Например:

>> url_validator("club123456")
{'type': 'club', 'id': '123456'}

Или:

>> url_validator("https://vk.com/habr")
{'type': 'symbolic', 'id': 'habr'}

Результат парсинга входных данных, например, для

python vktop.py vk.com/habr -t 10 -l -d 10

Выглядит следующим образом:

>> args = parse_args()
Namespace(days=10, likes=True, reposts=False, top=10, url={'type': 'symbolic', 'id': 'habr'})

Для дальнейшей работы с API и формирования ссылок на записи, требуется числовой ID страницы:

get_page_id

def get_page_id(url):
    """ Returns page's numeric ID """
    if url['type'] not in ['id', 'public', 'event', 'club']:
        params = {'screen_name': url['id']}
        request = requests.get(const.API_URL + 'utils.resolveScreenName?',
                               params=params)
        response = json.loads(request.text)['response']

        if response:
            if response['type'] == 'user':
                return response['object_id']
            else:
                # Groups have negative id
                return -response['object_id']
        else:
            raise PageNotAvailable(url['id'] + ' is not available')
    
    if url['type'] == 'id':
        return int(url['id'])
    else:
        return -int(url['id'])

Теперь перейдем непосредственно к работе с VK API.

Основной метод для получения записей — wall.get, за один запрос может вернуть максимум 100 постов, что достаточно мало. Для решения проблемы воспользуемся методом execute — универсальным методом, который позволяет запускать последовательность других методов, сохраняя и фильтруя промежуточные результаты. За один запрос execute может выполнить не более 25 обращений к API, из чего следует, что за один запрос к execute мы будем получать не 100 записей, как при обычном wall.get, а 2500. Execute имеет обязательный параметр code — код алгоритма в VKScript, формате, похожем на JavaSсript.

Запросы к API выполняются в цикле:

recieve_posts

def recieve_posts(page_id):
    """
    Returns :received_posts: from :page_id:
    """
    params = {'access_token': const.ACCESS_TOKEN,
              'id': page_id,
              }
    received_posts = []

    offset = 0
    while True:
        params['offset'] = offset
        response = json.loads(requests.post(
            const.API_URL + 'execute.getPosts?', params=params).text)

        # Interrupt loop when all posts were received
        if not response['response']:
            break

        received_data = response['response']
        for chunk in received_data:
            for post in chunk:
                received_posts.append(post)
        offset += 1

    return received_posts

В примере используется метод execute.getPosts — хранимая процедура, которая создана для удобства в настройках приложения в VK, что позволяет не передавать каждый раз код метода, а обращаться к нему по имени.

Тело execute.getPosts

// количество итераций циклазапросов к API
var ITERS = 25;
// количество сообщений получаемых за один запрос
var COUNT = 100;
// список полученных постов
var posts = []; 
var req_params = {
        "owner_id" : Args.id, // id страницы
        "offset" : 0,         // смещение
        "count"  : COUNT,
        "v" : "5.34"          // версия API
};
var i = 0;
while(i < ITERS) {
    req_params.offset = i*COUNT + ITERS*COUNT*Args.offset;
    // Делаем запрос к API
    var items = API.wall.get(req_params).items; 
    // Пустой список означает, что все записи получены
    if (items.length == 0) {
        return posts;
    }
    // Добавляем промежуточный результат
    // в итоговый список
    posts.push(items); 
    i = i + 1;
}
return posts;

Код, приведенный выше, неэффективен, т.к. получает много лишней информации о записях, что существенно увеличивает время получения и дальнейшей обработки. Например, при получении 30.000+ постов с одной страницы, суммарный объем полученного текста может составлять более 50 Мб.

Проведем фильтрацию ответов на стороне сервера, что значительно ускорит работу приложения:

Измененный execute.getPosts

// количество итераций циклазапросов к API
var ITERS = 25;
// количество сообщений получаемых за один запрос
var COUNT = 100;
// список полученных постов
var posts = []; 
var req_params = {
        "owner_id" : Args.id, // id страницы
        "offset" : 0,         // смещение
        "count"  : COUNT,
        "v" : "5.34"          // версия API
};
var i = 0;
while(i < ITERS) {
    req_params.offset = i*COUNT + ITERS*COUNT*Args.offset;
    // Делаем запрос к API
    var items = API.wall.get(req_params).items; 
    // Пустой список означает, что все записи получены
    if (items.length == 0) {
        return posts;
    }
    
    // Для хранения промежуточных ответов
    var tmp = {};
    // Фильтр. Получем список из id постов
    tmp.ids = items@.id;
    // Фильтр. Получем список из дат, публикаций постов
    tmp.dates = items@.date;
    // Так же, в execute передается доп. параметр Args.compar_key,
    // В зависимости от которого, добавляется нужный список.
    if (Args.compar_key == "likes") {
        tmp.likes = items@.likes@.count;
    } else {
        tmp.reposts = items@.reposts@.count;
    }
    posts.push(tmp);

    i = i + 1;
}
return posts;

Пример ответа:

response: [{
	ids: [677448, 649369, 593585],
	dates: [1450981583, 1449937068, 1448431475],
	likes: [14957, 14923, 15493]
}, {
	ids: [555311, 549734, 549376],
	dates: [1447699602, 1447677107, 1447675941],
	likes: [12384, 122548, 26709]
}]

Как видим, количество получаемой информации сократилось в разы. Казалось бы, такой результат должен удовлетворить, но, как упоминалось в начале статьи, есть параметр, задающий промежуток времени (в днях). Код выше никак не учитывает его. Например, если требуется получить самые популярные посты за последние два дня, то сначала скачиваются все посты, после чего локально отбираются те, которые опубликованы не ранее 2-ух прошлый дней. Таким образом, потенциальных постов, удовлетворяющих запросу, может быть штук 10, а получено будет несколько тысяч, что неприемлемо.

Передадим дополнительный параметр в метод execute.getPosts — крайнюю допустимую дату публикации в формате Unix Timestamp. Затем сравним последний полученный пост с этой датой. Если пост опубликован раньше, то возвращаем текущий список записей.

Итоговый метод execute.getPosts

// количество итераций циклазапросов к API
var ITERS = 25;
// количество сообщений получаемых за один запрос
var COUNT = 100;
// список полученных постов
var posts = []; 
var req_params = {
        "owner_id" : Args.id, // id страницы
        "offset" : 0,         // смещение
        "count"  : COUNT,
        "v" : "5.34"          // версия API
};
var i = 0;
while(i < ITERS) {
    req_params.offset = i*COUNT + ITERS*COUNT*Args.offset;
    // Делаем запрос к API
    var items = API.wall.get(req_params).items; 
    // Пустой список означает, что все записи получены
    if (items.length == 0) {
        return posts;
    }
    
    // Для хранения промежуточных ответов
    var tmp = {};
    // Фильтр. Получем список из id постов
    tmp.ids = items@.id;
    // Фильтр. Получем список из дат, публикаций постов
    tmp.dates = items@.date;
    // Так же, в execute передается доп. параметр Args.compar_key,
    // В зависимости от которого, добавляется нужный список.
    if (Args.compar_key == "likes") {
        tmp.likes = items@.likes@.count;
    } else {
        tmp.reposts = items@.reposts@.count;
    }
    // Args.deadline - крайняя дата публикации.
    // Если равна -1, значит нужно получить все посты.
    // Иначе смотрим на дату последнего полученного поста,
    // Если он опубликован раньше deadline, значит дальнейшие
    // Запросы делать не нужно. Вернуть результат.
    if (Args.deadline != -1 && tmp.dates[tmp.dates.length - 1] < Args.deadline) {
        // Флаг, для остановки локального цикла.
        tmp.stop = "True";
        posts.push(tmp);
        return posts;
    } else {
        posts.push(tmp);
    }

    i = i + 1;
}
return posts;

Код execute.getPosts получился достаточно неуклюжим. Это связано с ограничением на количество операций за один запрос.

Итоговая функция для получения постов:

recieve_posts

def recieve_posts(page_id, last_days, reposts):
    """
    Returns posts from :page_id: that were posted not earlier
    than :last_days: ago
    """
    deadline = datetime.now() - timedelta(days=last_days)
    unix_stamp = int(deadline.strftime("%s"))

    if reposts:
        compar_key = const.REPOSTS
    else:
        compar_key = const.LIKES

    params = {'access_token': const.ACCESS_TOKEN,
              'id': page_id,
              'compar_key': compar_key,
              'deadline':  unix_stamp if last_days != -1 else last_days
              }
    received_posts = []

    offset = 0
    ONGOING = True
    while ONGOING:
        params['offset'] = offset
        response = json.loads(requests.post(
            const.API_URL + 'execute.getPostsNew?', params=params).text)

        # Interrupt loop when all posts were received
        if not response['response']:
            break

        received_data = response['response']
        for chunk in received_data:
            chunk_size = len(chunk['ids'])
            for i in range(chunk_size):
                post = dict()
                post['date'] = datetime.fromtimestamp(chunk['dates'][i])
                if  last_days == -1
                    or post['date'].year   >= deadline.year
                    and post['date'].month >= deadline.month
                    and post['date'].day   >= deadline.day:

                    post['id'] = chunk['ids'][i]
                    post[compar_key] = chunk[compar_key][i]
                    received_posts.append(post)
            if 'stop' in chunk:
                ONGOING = False
                break
        offset += 1

    return received_posts

Теперь, когда у нас есть нужные посты, остается только отсортировать и вывести их на экран.

Пример работы. Получаем самые популярные посты в сообществе хабра за последний месяц:

Полный код доступен на Github.

Добавить комментарий