Парсер Яндекс.Маркет

14.09.2011
Сейчас я приведу пример о том, как написать небольшой парсер цен Яндекс.Маркета. На примере средней цены видеокарты.

Основа


Вкратце рассмотрим что же из себя представляет самый обычный парсер или как его ещё называют граббер. Это небольшой скрипт который получает html код какого либо сайта и ищёт в нём совпадения по ранее заданному пользователем (программистом) критерию. Это могут быть все ссылки со страницы, значения каких либо таблиц и т.д. Критерий обычно указывается с помощью регулярных выражений.

Начнём


Давайте для наглядность зайдём на Яндекс.Маркет и в строку поиска введём "Видеокарта GeForce GTX 590", нажимаем "Найти" и лицезреем список найденных продуктов. Давайте ещё поставим галочку напротив пункта "В наличии" и опять нажмём "Найти".
И мы получили ссылку типа:
http://market.yandex.ru/search.xml?text=Видеокарта%20GeForce%20GTX%20590%20&hid=91031&srnum=25&onstock=1

А перед тем как начать парсить, убедитесь что у вас подключено расширение Curl для php.
Теперь мы знаем как и откуда брать информацию, ну что ж, начнём:
//Инициализация

$ch = curl_init ();
//Куда лезем
curl_setopt ($ch , CURLOPT_URL , "http://market.yandex.ru/search.xml?text=Видеокарта%20" . $name . "&hid=91031&srnum=25&onstock=1");
//Каким браузером прикинимся
curl_setopt ($ch , CURLOPT_USERAGENT , "Mozilla/5.0");
curl_setopt ($ch , CURLOPT_RETURNTRANSFER , 1 );
//Получаем данные
$content = curl_exec($ch);
//Закрываем соединение
curl_close($ch);

Данные получены, осталось их обработать.

Обработка


Давйте зайдём обратно на нашу страничку поиска в Яндекс.Маркете и посмотри на её исходный код, а точнее на то, как там записана цена.
И можно заметить, что все цены занесены между следующими тегами:
<span class="b-prices__num"></span>

Т.е. с помощью регулярного выражения нам надо вытащить содержание этих тегов:
//Выдёргиваем цену

preg_match_all("/<span class="b-prices__num">(.*)</span>/isU", $content, $matches, PREG_PATTERN_ORDER);
//Сумма цен равно нулю
$sum = 0;
//Перебираем все найденные значения
for ($i = 0; $i < count($matches[0]); $i++)
{
$temp = $matches[1][$i];
//Удаляем из цены все знаки, кроме цифр
$temp = preg_replace ("/[^0-9]/","",$temp);
//Выводим цену на экран
echo $temp . '<br/>';
//Плюсуем цену к общей сумме
$sum += (integer)$temp;
}
//Выводим на экран среднюю цену
echo "<strong>Средняя цена</strong>: " . $sum / count($matches[0]) . "<br/>";

Вот и всё, тоже самое касается и всех остальных товаров, надо поменять только лишь цену. А если вы будете циклически перебирать большое количество товаров, то не забудьте в конце каждой итерации добавить задержку:
sleep(i);

Где i - количество секунд. Иначе в противном случае умный Яндекс забанит ваш ip на n-ое количество часов.
И в заключение, весь листинг:
$ch = curl_init ();		

curl_setopt ($ch , CURLOPT_URL , "http://market.yandex.ru/search.xml?text=Видеокарта%20" . $name . "&hid=91031&srnum=25&onstock=1");
curl_setopt ($ch , CURLOPT_USERAGENT , "Mozilla/5.0");
curl_setopt ($ch , CURLOPT_RETURNTRANSFER , 1 );
$content = curl_exec($ch);
curl_close($ch);
preg_match_all("/<span class="b-prices__num">(.*)</span>/isU", $content, $matches, PREG_PATTERN_ORDER);
$sum = 0;
for ($i = 0; $i < count($matches[0]); $i++)
{
$temp = $matches[1][$i];
$temp = preg_replace ("/[^0-9]/","",$temp);
echo $temp . '<br/>';
$sum += (integer)$temp;
}
echo "Средняя цена: " . $sum / count($matches[0]) . "<br/>";