Что такое парсер (граббер)? — примеры PHP-парсеров
Давайте разберёмся, что такое парсер или граббер в программировании. Что собой представляет процесс парсинга на примерах создания 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-ленты вы можете посмотреть тут: , а бесплатно скачать его исходный код тут: .
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-ленты вы можете посмотреть тут: , а бесплатно скачать его исходный код тут: .
Примечание: читайте также статью «Парсер сайтов на примере Яндекс парсера».
Короткая ссылка: http://goo.gl/fb/US91iE