Здравствуйте! Сегодня мне хотелось бы рассказать о том, как написать свой полноценный парсер отзывов о вашем магазине с известнейшей площадки "Яндекс Маркет" для дальнейшей его вставки на ваш сайт.

Существует как минимум два варианта получения данных об отзывах:

1. Получение данных непосредственно через API маркета.
2. Парсинг данных со страницы этих самых отзывов.

Конечно "правильнее" и красивее было бы использовать API, но в таком случае вам необходимо будет получить специальный ключ, который выдается сотрудниками Яндекса после изложения ваших намерений относительно API и предварительной проверки. Скорее всего, многим не захочется этим заниматься, поэтому я привожу пример, как можно реализовать нашу цель вариантом номер 2.

Для реализации поставленной задачи мы будем использовать php-библиотеку, которая называется PHP Simple HTML DOM Parser. Разумеется, ее необходимо предварительно скачать. Библиотека проста и удобна в использовании.

И так, давайте приступим к реализации нашего парсера.

Первым делом нам потребуется ссылка на страницу с отзывами о конкретном магазине. Выглядит она следующим образом:
http://market.yandex.ru/shop/[идентификатор магазина]/reviews

В качестве примера, я буду использовать страницу отзывов всем известного онлайн-гипермаркета OZON.RU. Страничка с его отзывами располагается по адресу http://market.yandex.ru/shop/155/reviews

Создадим под наш скрипт специальный каталог на сервере и сбросим туда, ранее скачанный PHP Simple HTML DOM Parser. В этой же папке создадим новый php-файл, назовем его parser.php и откроем для редактирования в любом текстовом редакторе.

Для начала использования библиотеки, необходимо ее подключить:

require_once ('simple_html_dom.php');

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

$shop_link = 'http://market.yandex.ru/shop/155/reviews';
$limit = 4;

Приступаем к работе с самой библиотекой и получаем содержимое страницы в $reviews_page:

$reviews_page = file_get_html($shop_link);

Я старался по максимуму экономить память, поэтому сразу убьем переменную $shop_link, а так же из всего HTML-кода страницы выцепим только блоки с самими отзывами в массив $reviews. Сделать это можно, завязавшись на класс каждого отзыва .b-aura-review:

unset($shop_link);
$reviews = $reviews_page->find('.b-aura-review');

Чуть выше мы уже задавали лимит выводимых отзывов, но если ограничение не нужно, или переменной $limit вообще не существует, то логично выводить количество всех найденных отзывов:

if ($limit == '' OR $limit == 0 OR !isset($limit)) {
    $limit = count($reviews);
}

Теперь в цикле FOR выведем каждый отдельный отзыв в нашем документе. Там все должно быть понятно. Комментарии присутствуют:

for ($i = 0; $i < $limit; $i++) {
    $review = str_get_html($reviews[$i]->innertext); // Парсим единичный отзыв
    $market_user = $review->find('.b-aura-username, .b-aura-username_anonymous'); // Получаем имя юзера или анонима
    $market_rating = $review->find('span[data-rate]'); // Получаем оценку отзыва
    $market_user_text = $review->find('.b-aura-userverdict__text'); // Получаем тексты отзыва. Важно знать, что если в отзыве, юзер заполнял поля "недостатки" и "достоинства" магазина, то все эти вещи попадут сюда (т.е. в массив $market_user_text). В отзыве эти поля могут быть заполнены, а могут и нет. Выцеплять именно текст пользователя будем далее.
    
    echo '<span style="color: #fa9c0e; margin-right: 5px;">'; // Делаем небольшой отступ и окрашиваем звездочки в цвет, как на маркете
        preg_match('/<span[^>]+data-rate=([\'"])?((?(1).+?|[^\s>]+))(?(1)\1)/', $market_rating[0]->outertext, $rating); // Регулярное выражение для получения значения оценки
        for($stars = 0; $stars < $rating[2]; $stars++) { // Выводим звездочки
            echo '&#9733;'; // Специальный HTML-символ, который выводит звездочку
        }
    echo '</span>';
    echo $market_user[0]->plaintext; // Выводим имя отзывающегося
    echo '<p>'.$market_user_text[count($market_user_text) - 1]->plaintext.'</p>'; // Выводим текст отзыва. Поскольку блок с текстом отзыва имеет тот же класс, что и блоки "Достоинств" и "Недостатков", то используем в качестве ключа массива $market_user_text общее количество найденных блоков с классом .b-aura-userverdict__text. Таким образом выводится самый последний. От общего числа ключей отнимаем 1 т.к. count() считает нам реальное число элементов, а нумерация ключей в массиве начинается с нуля.
    
    $review->clear(); // Экономим память
    unset($review); // Экономим память
    unset($market_user); // Экономим память
    unset($market_rating); // Экономим память
    unset($market_user_text); // Экономим память
}

Ну и напоследок сделаем еще пару телодвижений для экономии памяти... Нет, я не маниакально помешан на убийстве переменных и экономии лишнего байта памяти :). Дело в том, что библиотека достаточно прожорлива. Без использования unset'ов и метода clear() данный скрипт кушал аж 4.5 мозгобайта оперативной памяти. Не хорошо как-то получается. После оптимизации скрипт стал потреблять всего 954 килобайта.

$reviews_page->clear();
unset($reviews_page);
unset($reviews);
unset($rating);

Ну вот и все. Теперь наш скрипт выводит 4 последних отзыва о магазине OZON.RU.

При желании можно модернизировать скрипт, ограничив число слов в отзыве, вывести "Достоинства", "Недостатки" и дату. Вместо "Пользователь скрыл свои данные" вывести "Анонимный отзыв". Добавив пару строк кода можно сделать так, чтобы выводились только положительные отзывы и т.д. Остальное предоставляю вашей фантазии.

UPD 18.08.2014

Для CMS Joomla! я написал модуль, основанный на этом парсере. Подробнее здесь.

UPD 05.02.2015

В связи с тем, что ЯМ поменял дизайн (следовательно верстку и названия классов), а так же усилил защиту от роботов, данный пример после копипаста работать уже не будет. Убрал демо и кнопку скачать, т.к. следить за актуальностью статьи не имеет смысла. Она предназначена больше для примера. Модуль для Joomla! остается рабочим. Там немного модифицирована библиотека Simple HTML DOM Parser и кое-что переписано.

UPD 05.08.2015

Наконец дошли руки написать API-версию модуля отзывов о магазине для Joomla! 2.5 и 3.