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

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*(.+?)<\/a>[\s\S]+?\s*?(?:)?(.+?)parseUrl($_POST["target"]); break; } case "file": { if ($_FILES && $_FILES["target"]) { $file = $_FILES["target"]["tmp_name"]; if (!empty($file)) $data = file_get_contents($file); } break; } default: { throw new CHttpException(400,"неверный тип загружаемых данных"); break; } } preg_match_all($audioRegExp, $data, $parse); $songs = self::serializeVkSongs($parse); } $this->render("download", array("songs" => $songs, "count" => self::$songsCount)); }

Кому интересно узреть всё и сразу: github.com/zjiodeu/vkMusicParser
Всем спасибо. Если есть вопросы - пишите, отвечу в комментах.

Спасибо за внимание.

Теги: php, vk.com, phantomj

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

В начале я думал, что обойдусь 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*(.+?)<\/a>[\s\S]+?\s*?(?:)?(.+?)parseUrl($_POST["target"]); break; } case "file": { if ($_FILES && $_FILES["target"]) { $file = $_FILES["target"]["tmp_name"]; if (!empty($file)) $data = file_get_contents($file); } break; } default: { throw new CHttpException(400,"неверный тип загружаемых данных"); break; } } preg_match_all($audioRegExp, $data, $parse); $songs = self::serializeVkSongs($parse); } $this->render("download", array("songs" => $songs, "count" => self::$songsCount)); }

Кому интересно узреть всё и сразу: 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. Если вы лучше воспринимаете видео, а не текст, то у нас есть кое-что и для вас: