html текст
All interests
  • All interests
  • Design
  • Food
  • Gadgets
  • Humor
  • News
  • Photo
  • Travel
  • Video
Click to see the next recommended page
Like it
Don't like
Add to Favorites

Парсер Яндекса, пример на PHP

Написание парсеров сайтов - мое любимое занятие. Вот решил поделиться своими знаниями и с читателями. Написал за 15 минут простейший парсер поисковой выдачи Яндекса.

Сразу объясняю некоторые моменты:
1. Код писал для примера. Показаны основные принципы. Чисто функциональное программирование, никакого ООП.
2. Не учитывается пейджинг (разбитие по страницам).
3. Не берется сниппет из выдачи. Только позиция, урл и текст анкора.
4. Никак не учитывается обход защиты самого Яндекса и анализ CAPTCHA.

Страницу загружать будем с помощью cURL. Это быстро, просто и удобно.

function get_page($url)
{
 $ch = curl_init();
 $options = array(
  CURLOPT_TIMEOUT => 15,
  CURLOPT_RETURNTRANSFER => TRUE,
  CURLOPT_FOLLOWLOCATION => TRUE,
  CURLOPT_URL => $url,
  CURLOPT_USERAGENT => 'Google Chrome'
 );
 // можете добавить кучу других опций
 // http://php.net/curl_setopt
  
 curl_setopt_array($ch, $options);
 $data = curl_exec($ch);
 
 curl_close($ch);
 return $data;
}

Тут все понятно - в функцию передаем URL, на выходе получаем скачанную страницу. Функция универсальная и конкретно к специфике парсинга яндекса отношения не имеет. Просто почитайте документацию по cURL и сможете написать вашу собственную "идеальную" функцию/метод.

Еще одна нужная функция.

function set_utf8_meta($page)
{
 return preg_replace('/<head[^>]*>/',
   '<head><meta http-equiv="Content-Type" content="text/html; charset=UTF-8">',
   $page);
}

Дело в том, что для парсинга я буду использовать DOM и xpath, но библиотека libxml не понимает современный способ обозначения кодировки страницы в стиле html5, но кодировку нам указать необходимо, чтобы DOM адекватно "вытащил" русский текст.

Теперь, собственно, немного кода, который и даст нам нужный результат.

$query = 'парсер яндекса'; // запрос
$url = 'http://yandex.ru/yandsearch?text='. urlencode($query) .'&lr=213';
// 213 - регион (Москва)

$page = get_page($url); // скачиваем страницу
$page = set_utf8_meta($page); // выставляем нужный нам meta content


libxml_use_internal_errors(true); // дает нам управление над ошибками
$dom = new DOMDocument(); // создаем объект класса и выставляем немного настроек
$dom->preserveWhiteSpace = false;
$dom->resolveExternals = false; 
$dom->validateOnParse = false;
$dom->loadHTML($page);
$xpath = new DOMXpath($dom); // создаем объект класса DOMXpath

$serp_items = $xpath->query('//li[contains(@class, "b-serp-item")]');
//$serp_items->length; // кол-во результатов на странице

$links = array();

foreach ($serp_items as $item)
{
 $_tmp = array();
 $header_obj = $xpath->query('./h2', $item)->item(0);
 
 $_tmp['position'] = (int)$xpath->query('./b', $header_obj)->item(0)->nodeValue;
 
 $link_obj = $xpath->query('./a', $header_obj)->item(0);
 $_tmp['url'] = $link_obj->getAttribute('href');
 $_tmp['url_text'] = trim(preg_replace('/\s+/i', ' ', $link_obj->nodeValue));
// немного чистим строку и убираем лишние пробелы
 
 $links[] = $_tmp;
}

var_dump($links); // тут-то и находятся первые 10 результатов со страницы 
/* к примеру, данные из самой первой ссылки
[0]=>
  array(3) {
    ["position"]=>
    int(1)
    ["url"]=>
    string(40) "http://stakhov.ru/2008/08/yandex-parser/"
    ["url_text"]=>
    string(62) "Парсер Яндекса. Парсер Yandex. - stakhov.ru"
  }
*/

Теперь все три куска кода можете положить в один файл и запустить.
Дальше вы сами уже можете и с пейджингом разобраться и придумать как обходить защиту Яндекса.

Для того, чтобы доработать парсер до какого-то внятного вида, вам хорошо бы разобраться с cURL и xpath.

Кроме того, если у Яндекса верстка валидная и нам не нужно ее чистить, то для приведения верстки к адекватному виду перед парсингом других сайтов рекомендую использовать tidy.

Напоминаю - код писал на коленке, для примера. Если есть какие-то вопросы, то прошу в комментарии, я с удовольствием на них отвечу.

Для удобства весь код положил в один файлик.

UPD. 21.01.2013: Яндекс обновил немного верстку, поэтому пришлось подправить пару xpath запросов:
1. Было: $serp_items = $xpath->query('//li[@class="b-serp-item"]');
Стало: $serp_items = $xpath->query('//li[contains(@class, "b-serp-item")]');
Будет немного медленней работать из-за использования функции contains.

2. Было: $header_obj = $xpath->query('./div/h2', $item)->item(0);
Стало: $header_obj = $xpath->query('./h2', $item)->item(0);

Код в файле обновил. Если вдруг заметите, что возвращается пустой массив или появляются другие ошибки - напишите коммент, пожалуйста, с указанием тестируемого запроса и Вашим регионом в Яндексе, если он отличен от Москвы (213). Так я смогу поддерживать в актуальном состоянии парсер Яндекса и другие читатели смогут использовать рабочий код.
Читать дальше
Twitter
Одноклассники
Мой Мир

материал с glebov-gin.blogspot.ru

4

      Add

      You can create thematic collections and keep, for instance, all recipes in one place so you will never lose them.

      No images found
      Previous Next 0 / 0
      500
      • Advertisement
      • Animals
      • Architecture
      • Art
      • Auto
      • Aviation
      • Books
      • Cartoons
      • Celebrities
      • Children
      • Culture
      • Design
      • Economics
      • Education
      • Entertainment
      • Fashion
      • Fitness
      • Food
      • Gadgets
      • Games
      • Health
      • History
      • Hobby
      • Humor
      • Interior
      • Moto
      • Movies
      • Music
      • Nature
      • News
      • Photo
      • Pictures
      • Politics
      • Psychology
      • Science
      • Society
      • Sport
      • Technology
      • Travel
      • Video
      • Weapons
      • Web
      • Work
        Submit
        Valid formats are JPG, PNG, GIF.
        Not more than 5 Мb, please.
        30
        surfingbird.ru/site/
        RSS format guidelines
        500
        • Advertisement
        • Animals
        • Architecture
        • Art
        • Auto
        • Aviation
        • Books
        • Cartoons
        • Celebrities
        • Children
        • Culture
        • Design
        • Economics
        • Education
        • Entertainment
        • Fashion
        • Fitness
        • Food
        • Gadgets
        • Games
        • Health
        • History
        • Hobby
        • Humor
        • Interior
        • Moto
        • Movies
        • Music
        • Nature
        • News
        • Photo
        • Pictures
        • Politics
        • Psychology
        • Science
        • Society
        • Sport
        • Technology
        • Travel
        • Video
        • Weapons
        • Web
        • Work

          Submit

          Thank you! Wait for moderation.

          Тебе это не нравится?

          You can block the domain, tag, user or channel, and we'll stop recommend it to you. You can always unblock them in your settings.

          • glebovgin
          • домен blogspot.ru
          • домен glebov-gin.blogspot.ru

          Get a link

          Спасибо, твоя жалоба принята.

          Log on to Surfingbird

          Recover
          Sign up

          or

          Welcome to Surfingbird.com!

          You'll find thousands of interesting pages, photos, and videos inside.
          Join!

          • Personal
            recommendations

          • Stash
            interesting and useful stuff

          • Anywhere,
            anytime

          Do we already know you? Login or restore the password.

          Close

          Add to collection

             

            Facebook

            Ваш профиль на рассмотрении, обновите страницу через несколько секунд

            Facebook

            К сожалению, вы не попадаете под условия акции