Что такое парсер (граббер)? — примеры 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