Рассмотрим на полезном примере применение великой cURL. А применять ее будем к великому яндексу. Пишем парсер yandex выдачи.
Если вы решили написать свой парсер yandex выдачи или иной парсер, или создать своего бота незаменимым помощником в этом будет cURL.
Итак, Парсер yandex выдачи. Изучаем код:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 | <?php //Настройки $query = "сюда пишем запрос"; $query = urlencode($query); // Кодируем в запросе символы так, как положено, чтобы не осталось там русских букв. $url = "http://yandex.ru/yandsearch?text=".$query."&numdoc=10&lr=1"; // Ссылка с запросом. Регион "Москва и область" $ch = curl_init(); // Создаём объект-страницу с помощью cURL. curl_setopt($ch, CURLOPT_URL, $url); // Указываем откуда спарсить содержимое в наш объект. curl_setopt($ch, CURLOPT_HEADER, 0); //Включать или не включать header curl_setopt($ch, CURLOPT_USERAGENT, "Opera/9.00 (Windows NT 5.1; U; ru)"); // Прикинемся браузером. curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); //Возвращать трансфер или печатать напрямую curl_setopt($ch, CURLOPT_COOKIEFILE, "./cook.txt"); //С некоторого времени yandex перестал отдавать выдачу без печеньев curl_setopt($ch, CURLOPT_COOKIEJAR, "./cook.txt"); //поэтому cookie у нас тоже будет $result = curl_exec($ch); // Получаем страницу в виде строки. curl_close($ch); // Удаляем объект-страницу, исходный код страницы в $result. $regulyar='#<title>(?s)(.*)</title>#'; //Читаем title $rezregulyar = preg_match_all($regulyar, $result, $out); // Выдергиваем вхождение в строку $result регулярного выражения $regulyar, результаты отправляем в массив $out. if($rezregulyar){ //Если хоть одно вхождение нашлось. if(preg_match_all('#[а-я]*?\b (.*)страни#', $out[1][0], $tit)) { //Если имеется нужная строка $tit1=str_replace('млн', '000000', $tit[1][0]); //Заменяем "млн" шестью нулями $tit1=str_replace('тыс.', '000', $tit1); //Заменяем "тыс." тремя нулями $tit1=str_replace(' ', '', $tit1); //Удаляем пробелы $tit1=str_replace(' ', '', $tit1); //Удаляем пробелы echo "В индексе ".$tit1." страниц"; //Выводим результат } if(preg_match_all('#ничего не найдено#', $out[1][0], $tit)) { //Если "ничего не найдено" echo "В индексе 0 страниц"; //Выводим результат } } //if($ismatches) if(preg_match_all('#The document has moved#', $result, $tit)) { //Если попалась капча echo "Нарвались на капчу"; //Выводим результат } ?> |
Для получения доменов в выдаче, можно добавить с 25 строки следующий код:
1 2 3 4 5 6 7 8 9 10 11 12 13 | $regulyar2 = '#<span class="ei">(.*)</span>#'; //новое регулярное выражение $rezregulyar2=preg_match_all($regulyar2, $result, $svid); //Забиваем массив $svid if($rezregulyar2) { foreach ($svid[1] as $svidms) { //Прогулка по массиву $svidms=strip_tags($svidms); //Вырезаем тэги HTML и PHP $hhfr=strpos($svidms, "/"); //Ищем первый символ "/" if ($hhfr>0) $url = substr($svidms, 0, $hhfr); //если найден "/", то обрезаем строку до первого "/" else $url=$svidms; echo $url."<br>"; } } |
Должно быть все понятно. Комментировал все что можно. Кому не понятно – спрашиваем, у кого иное мнение на то, как нужно парсить выдачу – жду коментарий. У кого есть предложения – высказывайтесь.
Март 25th, 2010 - 2:21 пп
Ну чтож сколько я их уже видел попробую отпишусь
Апрель 22nd, 2010 - 11:19 дп
Кроме cURL, очень плезным инструментом для написания парсеров является phpQuery.
Октябрь 9th, 2010 - 2:48 дп
Не работает. Белая страница и на хостинге и на локале.
Октябрь 9th, 2010 - 10:18 дп
19 строку нужно подправить. Яндекс сейчас пишет не «страниц», а «ответов»
И еще. Код нужно сохранить в кодировке UTF-8
Февраль 1st, 2011 - 12:45 дп
Здравствуйте. Сломал голову ): Ни в какую не хочет работать. Пробовал править регулярку – ноль ):
Февраль 1st, 2011 - 8:51 пп
В прошлом году работал
Сейчас не использую.
Что именно не работает? Ошибки выдает? Если не выдает, надо найти. Поставьте после каждого if{}: else echo «erorr #1…9″;
Февраль 1st, 2011 - 11:16 пп
Сделал через Яндекс иксэмэл … Это проще и надёжнее. Спасибо!