Парсер id вконтакте по аудиозаписям. Парсинг по аудио или как искать меломанов
Привет, Хабр! Представляю вашему вниманию свой скромный проект для парсинга аудио Вконтакте.
Так как слушать музыку напрямую вконтакте не круто и не всегда возможно/удобно, я подумал, что неплохо бы иметь возможность стягивать свой плэйлист и плэйлисты друзей. Недостатком тех программ, что я юзал, было то, что приходилось качать по одной песне. Если плэйлист большой, то это не удобно и жутко долго. От своего приложения я хотел, чтобы оно могло качать всё и сразу, и чтобы музыка сортировалась по исполнителям.
В начале я думал, что обойдусь cURL, но как оказалось, контакт хитёр и выгружает по умолчанию ~50 песен. Но об этом позже.
1. Авторизация ВК
Тут я особо не изворачивался. Для того, чтобы получить свой профиль ВК, просто прикручиваем свои кукисы. Кука, которая нам нужна, называется remixsid .2. Получение контента страницы с помощью phantomJS
Скачать фантом можно отсюда . Для Linux версии достаточно его просто распаковать и добавить линк в /usr/bin (по желанию). О том, что это и с чем его едят, можете ознакомиться .Как я уже говорил, контакт выгружает не весь список аудио по умолчанию. Он подгружает его динамически в процессе прокручивания окна. К тому времени как я решил подключить фантом, у меня уже была готовая структура для парсинга странички, написанная на php, поэтому я решил не переписывать это на js. Сам фантом здесь только проскролливает окно и отдает контент страницы.
// return vk page content private function parseUrl($url) { // get remixsid value $sid = $this->RemixSid(); // get scrolled page $command = "phantomjs ".$_SERVER["DOCUMENT_ROOT"]."/js/phantom.vk.js" . " $sid $url"; $response = shell_exec($command); return $response; }
Листинг
Листинг
/*
* it must run from phantomjs
* args - remixsid cookie value
* args - target vk url
*/
var sys = require("system"),
page = require("webpage").create();
phantom.addCookie({
"name": "remixsid",
"value": phantom.args,
"domain": "vk.com"
});
page.settings = {
loadImages: false,
javascriptEnabled: true,
userAgent: "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.1 (KHTML, like Gecko) Chrome/22.0.1207.1 Safari/537.1",
};
page.open(phantom.args, function() {
var tries = 0,
t = setInterval(function() {
page.scrollPosition = { top: page.scrollPosition.top + screen.height, left: 0 };
++tries;
if (tries === 40) {
console.log(page.content);
clearInterval(t);
phantom.exit();
}
},100);
});
Думаю, тут всё должно быть понятно. Объект page умеет работать с веб-страницами, передавать данные POST, GET, PUT, выполнять JS непосредственно в контексте открытой страницы и многое другое.
Внешние переменные доступны через массив args, глобального объекта phantom. На протяжении 4 секунд скрипт проскролливает страницу и отдает её контент page.content . Мне этого хватает, чтобы спарсить овер 2000+ песен.
Вывод в phantomJS осуществляется с помощью обычного console.log();
3. Парсим?
Если посмотреть исходный код странички, то мы найдем возле каждого трэка ссылку на поддомен vk.me, откуда собственно и загружаются аудиозаписиЯ не прикручивал библиотек для разбора html типа . А обошелся обычным регэкспом:
public function actionDownload()
{
$data = "";
// TODO: include html simple dom
$audioRegExp = "/\s*
Кому интересно узреть всё и сразу: github.com/zjiodeu/vkMusicParser
Всем спасибо. Если есть вопросы - пишите, отвечу в комментах.
Спасибо за внимание.
Теги: php, vk.com, phantomj
Сбор и анализ людей, слушающих определенные песни и исполнителей, поможет сразу в нескольких случаях. Это и продвижение концертов, и развитие музыкальных пабликов, и выбор песен для своих постов, но обо всем по порядку.
ППоиск исполнителей и композиций
Для поиска аудитории, слушающей определенных исполнителей или песни, нам понадобится инструмент , который можно найти в левом меню с инструментами.
В парсере есть возможность выбирать разные города из России и собирать из них любителей той или иной музыки. Можно выбрать разные варианты для поиска аудитории, это:
— поиск только по исполнителю (найдутся все люди, добавившие песни выбранного исполнителя)
— поиск одновременно по исполнителю и названию композиции (например, Nirvana — Come As You Are)
— поиск только по названию композиции (указываем нужное произведение и получаем всех людей, добавивших его в аудиозаписи).
Здесь же можно задать фильтр по точному вхождению, который позволяет получить результат в том же виде, что вы указали в запросе. Например, если вы указали «Nirvana — Come As You Are», то соберутся только люди, у которых в аудиозаписях присутствует точно такое название. Вы не получите ни вариант «Come As You Are — Nirvana», ни вариант «Come As You Are» без слова Nirvana.
Далее выбираем количество композиций нужной группы у пользователя. Это позволит собрать фанатов конкретных групп и исключить людей, которые могли услышать одну песню, добавить ее к себе, но не знать ничего об исполнителе.
Чтобы отбросить «мусорные композиции», например, оригинальная песня звучит 5 минут, а у пользователя добавлена десятисекундная композиция, используйте фильтрацию по длительности композиции.
ППоиск композиций в постах
Помимо поиска людей, добавивших к себе в аудиозаписи нужные композиции, мы можем искать людей, которые проявляли активность в постах с определенными треками. Для этого нам потребуется инструмент , в нем можно указать ключевые слова по которым будет проходить поиск. Например, найдем все посты со словом Nirvana, можно выбрать период их создания, а также задать сбор только постов с определенными вложениями. К примеру, собрать все записи, в которых упоминалось слово Nirvana, а к посту прикреплены аудиозаписи.
Так мы получим все посты, в которых встречается упоминание нужной группы или песни, а дополнительные фильтры помогут оставить только нужные посты.
Чтобы выгрузить людей, проявивших активность в этих постах, надо нажать «Парсить отфильтрованный список» и выбрать какую аудиторию надо получить. Например, можно найти только людей, которым понравилось несколько найденных записей.
ААнализ аудитории
Любую собранную аудиторию можно проанализировать в разделе задания, нажав на воронку и выбрав пункт «Аналитика». Чем лучше вы знаете свою аудиторию, тем проще будет подобрать к ней ключ.
Во-первых, если вы искали группы определенного жанра, то могли пропустить несколько из них или посчитать, что у них мало слушателей. При помощи анализа аудитории вы увидите все композиции, которые люди добавили к себе в аудиозаписи и узнаете их процентное соотношение. В дальнейшем вы сможете отдельно собрать аудиторию по найденным в аналитике композициям.
Во-вторых, многие авторы любят прикреплять к записи различные песни и часто их выбор зависит от личных предпочтений, либо от трендов. В тоже время, ваша аудитория может любить совершенно другую музыку и все ваши старания пройдут даром. При помощи анализа аудитории можно изучить ее музыкальные предпочтения и добавлять только песни, которые слушают именно участники вашего сообщества.
P.S. Если вы лучше воспринимаете видео, а не текст, то у нас есть кое-что и для вас:
pull 15 февраля 2014 в 23:25Парсер аудио ВКонтакте PHP + phantomJS
- PHP
Привет, Хабр! Представляю вашему вниманию свой скромный проект для парсинга аудио Вконтакте.
Так как слушать музыку напрямую вконтакте не круто и не всегда возможно/удобно, я подумал, что неплохо бы иметь возможность стягивать свой плэйлист и плэйлисты друзей. Недостатком тех программ, что я юзал, было то, что приходилось качать по одной песне. Если плэйлист большой, то это не удобно и жутко долго. От своего приложения я хотел, чтобы оно могло качать всё и сразу, и чтобы музыка сортировалась по исполнителям.
В начале я думал, что обойдусь cURL, но как оказалось, контакт хитёр и выгружает по умолчанию ~50 песен. Но об этом позже.
1. Авторизация ВК
Тут я особо не изворачивался. Для того, чтобы получить свой профиль ВК, просто прикручиваем свои кукисы. Кука, которая нам нужна, называется remixsid .2. Получение контента страницы с помощью phantomJS
Скачать фантом можно отсюда . Для Linux версии достаточно его просто распаковать и добавить линк в /usr/bin (по желанию). О том, что это и с чем его едят, можете ознакомиться .Как я уже говорил, контакт выгружает не весь список аудио по умолчанию. Он подгружает его динамически в процессе прокручивания окна. К тому времени как я решил подключить фантом, у меня уже была готовая структура для парсинга странички, написанная на php, поэтому я решил не переписывать это на js. Сам фантом здесь только проскролливает окно и отдает контент страницы.
// return vk page content private function parseUrl($url) { // get remixsid value $sid = $this->RemixSid(); // get scrolled page $command = "phantomjs ".$_SERVER["DOCUMENT_ROOT"]."/js/phantom.vk.js" . " $sid $url"; $response = shell_exec($command); return $response; }
Листинг
Листинг
/*
* it must run from phantomjs
* args - remixsid cookie value
* args - target vk url
*/
var sys = require("system"),
page = require("webpage").create();
phantom.addCookie({
"name": "remixsid",
"value": phantom.args,
"domain": "vk.com"
});
page.settings = {
loadImages: false,
javascriptEnabled: true,
userAgent: "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.1 (KHTML, like Gecko) Chrome/22.0.1207.1 Safari/537.1",
};
page.open(phantom.args, function() {
var tries = 0,
t = setInterval(function() {
page.scrollPosition = { top: page.scrollPosition.top + screen.height, left: 0 };
++tries;
if (tries === 40) {
console.log(page.content);
clearInterval(t);
phantom.exit();
}
},100);
});
Думаю, тут всё должно быть понятно. Объект page умеет работать с веб-страницами, передавать данные POST, GET, PUT, выполнять JS непосредственно в контексте открытой страницы и многое другое.
Внешние переменные доступны через массив args, глобального объекта phantom. На протяжении 4 секунд скрипт проскролливает страницу и отдает её контент page.content . Мне этого хватает, чтобы спарсить овер 2000+ песен.
Вывод в phantomJS осуществляется с помощью обычного console.log();
3. Парсим?
Если посмотреть исходный код странички, то мы найдем возле каждого трэка ссылку на поддомен vk.me, откуда собственно и загружаются аудиозаписиЯ не прикручивал библиотек для разбора html типа . А обошелся обычным регэкспом:
public function actionDownload()
{
$data = "";
// TODO: include html simple dom
$audioRegExp = "/\s*
Кому интересно узреть всё и сразу: github.com/zjiodeu/vkMusicParser
Всем спасибо. Если есть вопросы - пишите, отвечу в комментах.
Спасибо за внимание.
Теги: php, vk.com, phantomj