market.yandex.ru парсер
Недавно появилась задача парсить странички. Точнее market.yandex.ru.
Собрать все описания в готовом к вставке в базу виде а также доступные изображения к товару.
Исторически сложилось что с регулярками у меня хуже чем с XSLT.
Все хорошо но маркет не дает валидный код и парсить его напрямую у меня не получилось.
На помощь пришел Tidy.
<?php $YMI=(isset($_GET['ymid'])) ? urldecode($_GET['ymid']): ""; // переменная хранит адрес страницы с описанием на Яндексе $content = file_get_contents($YMI); // $content = iconv("CP1251", "UTF-8//IGNORE", $content); // это строка ненужна така Яндекс маркет перешел на UTF-8 $config = array( "indent" => true, "output-xml" => true, "wrap" => 200); $tidy = new tidy; $tidy->parseString($content, $config, "utf8"); $tidy->cleanRepair(); $xml=simplexml_load_string ($tidy); $groups = $xml->xpath("//table[@class="modelProperties"]//tr/td[@class="title"]/b"); $strings = $xml->xpath("//table[@class="modelProperties"]//tr/td[@class="title"]/b|//table[@class=\'modelProperties\']//td[@class=\'label\']/span/text()|//table[@class=\'modelProperties\']//tr/td[position()=2]/text()"); $results_groups=array(); $results=array(); $i=0; $GI=0; //print_r($strings); while($i<sizeof ($strings)) { if(in_array($strings[$i],$groups)) { $GI=sizeof($results_groups); $results_groups[]=(string)$strings[$i]; $results[$GI][]=array((string)$strings[$i+1],(string)$strings[$i+2]); $i=$i+3; } else { $results[$GI][]=array((string)$strings[$i],(string)$strings[$i+1]); $i=$i+2; } } $photos = $xml->xpath("//table[@class="modelpict"]//a/@href"); if(empty($photos)) { $photos = $xml->xpath("//table[@class="modelpict"]//img/@src"); } foreach( $photos as $photo) { print "<img src=\""; print (string) $photo; print "\" />"; } print "<hr /><table><caption>Технические характеристики</caption>"; foreach($results_groups as $k=>$v) { print "<tr><td colspan=\"2\" align=\"center\" style=\"background-color:#ccc\">".$v."</td></tr>"; foreach($results[$k] as $arr) { print "<tr><td>".$arr[0]."</td><td>".$arr[1]."</td></tr>"; } } print "</table>"; ?>
16 comments to “market.yandex.ru парсер”
Октябрь 13th, 2008 at 03:02
здравствуйте, с вами можно по аське связаться?
Октябрь 29th, 2008 at 11:05
DONT WORK THIS ONE??? WHYY??
Декабрь 24th, 2008 at 18:30
Пожалуйста, объясните как это работает!
Февраль 25th, 2009 at 07:51
это все Xpath, но он работает только с валидным xml, что бы парсить любые странички надо преобразовать html у меня есть об этом подробнее…
Февраль 25th, 2009 at 11:10
Именно по этому в начале статьи речь идет о Tidy
Август 12th, 2009 at 17:32
Не заработал скрипт у меня, пишет ошибки. Что я не так делаю?
Спасибо.
Август 21st, 2009 at 16:31
Какие ошибки?
Август 27th, 2009 at 14:14
А где взять Tidy?
Август 31st, 2009 at 00:06
У меня на локалке вот что:
Warning: file_get_contents() [function.file-get-contents]: Filename cannot be empty in /var/www/tt.servebbs.org/htdocs/parser/pars.php on line 4
Fatal error: Class ‘tidy’ not found in /var/www/tt.servebbs.org/htdocs/parser/pars.php on line 13
Январь 6th, 2010 at 15:41
Что-то не работает код… Стало интересно, я тоже раньше делал парсур, но у меня получилось аж 15 Кб главного скрипта и еще несколько примочек типа антикапча, лог, остановка/продление в случае разрыва…
Tpoxa, как вы боретесь с капчей Яндекса?
Январь 7th, 2010 at 13:06
Когда я написал этот пример яндекс маркет еще не боролся с грабберами. Не было капчи и других блокировок по количеству запросов.
Январь 15th, 2010 at 16:26
Parse error: syntax error, unexpected T_STRING in Z:\home\localhost\www\index2.php on line 19
что за ошибка?
Февраль 1st, 2010 at 17:21
Думаю имеет смысл обновить информацию или удалить статью, раз она не действует на сегодняшний день!
Вопрос очень актуальный и многие бы с удовольствием бы прочли обновление!!!
Февраль 18th, 2010 at 20:20
Господа, что значит не актуально? Всё прекрасно работает =)) Чуть-чуть сообразительности и не много знания php и у Вас тоже всё заработает. Как? Вам сюда http://php.net
Февраль 18th, 2010 at 22:46
Спасибо Komyak, я добавил некоторые комментарии в код, также хочу добавить что эта статья это скорее как один из возможных способов решения проблемы. И никак не претендует на полноценное приложение.
Март 8th, 2010 at 23:07
Вы создаете парсеры на заказ? Свяжитесь со мной по почте, плз.