Что такое парсер (граббер)? — примеры PHP-парсеров

parser icon png Давайте разберёмся, что такое парсер или граббер в программировании. Что собой представляет процесс парсинга на примерах создания PHP-грабберов. В качестве бонуса — готовые парсеры RSS-ленты и получения контентной части статей с их demo-сайтами.

Парсер (от англ. parser) или граббер (от англ. grabber) — программное обеспечение, предназначенное для анализа и разбора исходных данных, с целью их обработки и дальнейшей использования в требуемом виде.

Происхождение термина «граббер» тесно связано с парсерами, но подразумевает извлечение данных из источника для этого не предназначенного, т. е. мы буквально «грабим» данные источника для их использования в личных целях.

Сам же процесс парсинга (англ. parsing) или скраппинга (англ. skrapping) обычно подразумевает выявление уникальных признаков или закономерностей употребления интересующего нас фрагмента данных, с целью построения соответствующих правил их «выделения» и «захвата» в исходных данных.

Пример использования cURL для PHP-граббера

Отдельно стоит отметить, что для работы граббера зачастую используется имитация браузера (например, подмена User Agent) с целью скрытия процесса граббинга и обхода защиты от граббинга.

Пример использования cURL в PHP:

$ch = curl_init();
curl_setopt_array($ch, array(
  CURLOPT_URL => $url,
  CURLOPT_USERAGENT => 'Mozilla/5.0 (Windows NT 6.1; rv:8.0) Gecko/20100101 Firefox/8.0',
  CURLOPT_AUTOREFERER => true, // имитация передачи реферера при редиректе
  CURLOPT_ENCODING => "", // поддержка декодировния результата: identity, deflate и gzip
  CURLOPT_HEADER => false, // отключение заголовков из вывода
  CURLOPT_RETURNTRANSFER => true, // результат в curl_exec()
  CURLOPT_CONNECTTIMEOUT => 60, // ограничение времени соединения
  CURLOPT_TIMEOUT => 60, // ограничение времени выполнения cURL функции
  CURLOPT_FOLLOWLOCATION => true, // следовать по редиректам
  CURLOPT_MAXREDIRS => 5, // максимальное кол-во редиректов
  CURLOPT_SSL_VERIFYPEER => false, // отключение проверки сертификата узла
  CURLOPT_SSL_VERIFYHOST => false, // отключение проверки сертификата хоста
));
$content = curl_exec($ch);
$errno = curl_errno($ch);
$error = curl_error($ch);
$info = curl_getinfo($ch);
curl_close($ch);

PHP-парсер значения из строки

Например, из строки: не имей 100 рублей, а имей 100 друзей — необходимо получить количество рублей. Уникальными признаками здесь могут служить целочисленное значение и идентификатор денежной единицы «рублей».

парсинг значения из строки
Парсинг значения из строки

Простейшее правило парсинга на основе регулярного выражения в PHP интерпретации будет иметь вид:

$str = 'не имей 100 рублей, а имей 100 друзей';
if( preg_match_all("'(\d+)\s*рублей'iu", $str, $matches) ){
  echo '<pre>';
  var_dump($matches);
  echo '</pre>';
}

Результат работы этого PHP-парсера будет иметь вид:

array(2) {
  [0]=>
  array(1) {
    [0]=>
    string(16) "100 рублей"
  }
  [1]=>
  array(1) {
    [0]=>
    string(3) "100"
  }
}

Рассмотрим регулярное выражение: '(\d+)\s*рублей'iu — подробней:

  • само выражение «обёрнуто» одинарными кавычками с целью использования модификаторов: i — игнорировать регистр и u — используется UTF-кодировка;
  • круглые скобки — подмаска, с вложенным правилом, которая возвращается как второе значение массива $matches[1];
  • \d — спецсимвол для обозначения символа от 0 до 9;
  • + — квантификатор для обозначения одного или более символов;
  • \s — спецсимвол для обозначения пробельного символа (пробел, табуляция и т. д.);
  • * — квантификатор для обозначения ни одного или более символов.

Примечание: парсер может быть написан на любом языке программирования: C#, Delphi, Java, PHP и т. д., но суть его от этого не меняется.

Частным и частым случаем парсинга служит разбор структурированных данных в формате XML или HTML.

XML-парсер на PHP

Для создания XML-парсера на PHP удобно использовать расширение SimpleXML для преобразования XML в объект, например:

$str = <<<XML
<?xml version='1.0'?>
<document>
 <price>100</price>
 <unit>руб.</unit>
</document>
XML;
$xml = simplexml_load_string($str);
echo '<pre>';
var_dump($xml);
echo '</pre>';

Результат работы этого PHP-парсера будет иметь вид:

object(SimpleXMLElement)#1 (2) {
  ["price"]=>
  string(3) "100"
  ["unit"]=>
  string(7) "руб."
}

Ваш бонус: пример работы PHP-парсера разбора RSS-ленты вы можете посмотреть тут: parser.c3h.ru/rss, а бесплатно скачать его исходный код тут: yadi.sk/d/6f8KsYkPtCyjD.

HTML-парсер на PHP

Для создания HTML-парсера на PHP удобно использовать расширение DOM, например:

$str = '<html><body>не имей <span class="price">100</span> рублей, а имей <span class="count">100</span> друзей</body></html>';
$doc = new DOMDocument();
$doc->loadHTML($str);
$spans = $doc->getElementsByTagName('span');
if( $spans->length>0 ){
  for( $i=0; $i<$spans->length; $i++ ){
    $span = $spans->item($i);
    if( $span->hasAttribute('class') ){
      $class = $span->getAttribute('class');
      if( preg_match("'^price$'iu", $class) ){
        echo 'price = '. $span->textContent .'<br/>';
      }
    }
  }
}

Результат работы этого PHP-парсера будет иметь вид:

price = 100

Ваш бонус: пример работы PHP-парсера разбора RSS-ленты вы можете посмотреть тут: parser.c3h.ru/html, а бесплатно скачать его исходный код тут: yadi.sk/d/KdPU4OnitCyhZ.

Примечание: читайте также статью «Парсер сайтов на примере Яндекс парсера».

Короткая ссылка: http://goo.gl/fb/US91iE

seoonly.ru
seoonly.ru комментирует...

Почему-то необоснованно считают что парсеры пишут новички в пыхе))

shabananton
shabananton комментирует...

Спасибо. Константин, а парсеры на заказ пишете?

Константин Кирилюк
Константин Кирилюк комментирует...

2seoonly Пишут на том, что знают… некоторые штуки я вообще реализовывал на JavaScript, как букмарклет.

Константин Кирилюк
Константин Кирилюк комментирует...

2shabananton Можно посмотреть, что за задача, и даже что-то написать, но вот с интеграцией уже сложнее. Я уже давно не работаю на заказ, не потому что их нет или своего хватает, просто сил нет.