Парсер Яндекс.Маркет
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/>";