😼
Выбор
редакции
17 мая 2019
10 959
В избр.
Сохранено
Как находить самые популярные посты конкурентов “ВКонтакте”
Долго я искал решение, чтобы сортировать посты “ВКонтакте” по разным критериям: лайки, репосты, комментарии. Но все, что находил, было платным или ограничивало функционал. Недавно нашел бесплатный сервис для поиска вирусного контента и хочу им поделиться.
Таким инструментом оказалось небольшое приложение Посты ВКонтакте. Приложение бесплатное, быстрое, удобное и продуманное.
Распишу подробную инструкцию работы с сервисом.
1. Выберите источники для отслеживания
Можно настроить аналитику на свое сообщество и находить вечнозеленый контент или искать классные посты конкурентов.
2. Сортируем и выбираем нужный период
Результаты поиска можно отсортировать. Убывание лайков на 1 просмотр ставьте, когда в списке для анализа много пабликов с большим разбросом подписчиков, чтобы не потерять интересные посты от небольших сообществ.
В 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.