Парсер yandex выдачи

Автор: begunok     Категория: Кодинг

Рассмотрим на полезном примере применение великой 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('&nbsp;', '', $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>";  
		}  
	}

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

Метки: ,

7 Комментариев на “Парсер yandex выдачи”

  1. Александр сказал:

    Ну чтож сколько я их уже видел попробую отпишусь

  2. UaSnakes сказал:

    Кроме cURL, очень плезным инструментом для написания парсеров является phpQuery.

  3. Сергей сказал:

    Не работает. Белая страница и на хостинге и на локале.

  4. begunok сказал:

    19 строку нужно подправить. Яндекс сейчас пишет не «страниц», а «ответов»
    И еще. Код нужно сохранить в кодировке UTF-8

  5. Дмитрий сказал:

    Здравствуйте. Сломал голову ): Ни в какую не хочет работать. Пробовал править регулярку – ноль ):

  6. begunok сказал:

    В прошлом году работал :)
    Сейчас не использую.
    Что именно не работает? Ошибки выдает? Если не выдает, надо найти. Поставьте после каждого if{}: else echo «erorr #1…9″;

  7. Дмитрий сказал:

    Сделал через Яндекс иксэмэл … Это проще и надёжнее. Спасибо!

Оставить комментарий