На сегодняшний день, всё чаще встает вопрос о том, что нужно обработать какую-либо информацию или что-то спасрсить со стороннего сайта. Это может быть необходимо по разными причинам: для наполнения сайта контентом, актуализации технических характеристик в интернет-магазине, подгружения различной информации и так далее.
В такие моменты у разработчика возникает вопрос, на какой же библиотеке лучше всего написать парсер?
Собственно, передо мной тоже встал такой вопрос, и я попытался разобраться и найти ответ. Сейчас я расскажу вам, какую, по моему мнению, лучше выбрать библиотеку для парсинга.
XPath и DOM
Это стандартные модули, которые уже встроены в PHP, начиная с 5 версии. Огромным плюсом, является то, что нет необходимости использовать какие-то вспомогательные методы. По мнению многих, именно это делает его одним из лучших инструментов для парсинга.
Может сложиться впечатление, что XPath и DOM – слишком сложны в изучении, но хочу вас уверить, это не так. Как только вы разберетесь с базовыми принципами, XPath может стать для вас инструментом №1.
Так же еще одним из плюсов является то, что мощь языка XPath заключается в осях (база языка), которые позволяют добраться до абсолютно любого документа в исходном коде.
Пример кода написанный с помощью XPath и DOM. Он ищет в разметке все теги и преобразовывает их атрибут src
1 2 3 4 5 6 7 8 9 |
$dom = new DOMDocument; $dom->loadHTML($html); $images = $dom->getElementsByTagName('img'); foreach ($images as $image) { $image->setAttribute('src', 'http://example.com/' . $image->getAttribute('src')); } $html = $dom->saveHTML(); |
Конечно, данный инструмент не лишен минусов. Так как движок предназначен больше для работы с XML, то есть некоторые нюансы. Например, все HTML теги обязательно должны быть закрыты.
PHP Simple HTML DOM Parser
Это PHP- библиотека, которая позволяет парсить HTML-страницу с помощью jQuery- подобных селекторов.
Сильная сторона данной библиотеки – это умение работать с невалидным HTML-кодом.
Никогда не бывает проблем с кодировкой, так как выполняется автоматическое преобразование.
Simple HTML DOM может находить и отфильтровывать вложенные элементы, обращаться к их атрибутам и выбирать отдельные логические элементы кода.
В этом примере мы находим все ссылке на странице и внутри foreach
можем делать с ними всё что хотим
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
<?php //подгружаем библиотеку require_once 'library/simplehtmldom.php'; //создаём новый объект $html = new simple_html_dom(); //загружаем в него данные $html = file_get_html('http://habrahabr.ru/'); //находим все ссылки на странице и... if($html->innertext!='' and count($html->find('a'))) { foreach($html->find('a') as $a){ //... что то с ними делаем } } //освобождаем ресурсы $html->clear(); unset($html); ?> |
Хотелось бы сказать, что и эта библиотека не лишена минусов. Ее главным недостатком является то, что среди всех ее основных конкурентов данная библиотека обладает самой низкой скоростью обработки, но этот недостаток заметен только при больших объёмах информации.
В общем, библиотека Simple HTML DOM очень простая. Есть понятная и удобная документация, что немаловажно для новичка. Так что это может быть оптимальным вариантом для начинающего парсер-кодера.
phpQuery
Так же как и Simple HTML DOM, phpQuery – это библиотека, которая является аналогом jQuery на PHP.
Данная библиотека работаем на DOM. PhpQuery, одна из самых быстрых библиотк, которая может работать с атрибутами, селекторами, событиями и даже с Ajax-ом.
Примиер кода на phpQuery
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
<?php require ('library/phpQuery.php'); $hbr = file_get_contents('http://%username%.habrahabr.ru/blog/'); $document = phpQuery::newDocument($hbr); $hentry = $document->find('div.hentry'); foreach ($hentry as $el) { $pq = pq($el); // Это аналог $ в jQuery // меняем атрибуты найденого элемента $pq->find('h2.entry-title > a.blog')->attr('href', 'http://%username%.habrahabr.ru/blog/')->html('%username%'); $pq->find('div.entry-info')->remove();//удаляем ненужный эл-нт $tags = $pq->find('ul.tags > li > a'); $tags->append(': ')->prepend(' :'); // добавляем : по бокам // добавляем контент в начало найденого элемента $pq->find('div.content')->prepend('<br />')->prepend($tags); } echo $hentry; ?> |
О минусах данной библиотеки я нашел мало информации, а если быть точнее, почти ничего. Выделить наверно могу только то, что последний раз phpQuery обновлялась в далеком 2009 году.
Если вы знаете еще какие-то минусы данной библиотеки, напишите в комментариях.
Вывод
В своем исследовании, я пришел к тому, что лучше всего пользоваться библиотекой phpQuery.
Если у вас конечно очень простые задачи, то логичнее будет использовать стандартные модули PHP ну или регулярные выражения.
Еще хотелось бы написать что, свое мнение я основываю на отзывах и комментариях, которые писали другие, более опытные разработчики на форумах и блогах. На самом деле существует десятки различных библиотек для парсинга и вообще есть много разных инструментов, но из всех, что я находил, вошедшие в мой список, показались мне самыми интересными.
Возможно, какая-то другая библиотека или инструмент для парсинга, вам будет ближе, так что можете написать в комментариях, что используете вы, буду интересно узнать ваше мнение.
Наполнение контентом своего ресурса — вещь важная. Я предпочитаю пользоваться готовыми программными решениями. Все-таки работа вебмастера отнимает и так много времени. На изучение программирования времени категорически не хватает 🙂
Сейчас тоже пишу небольшой скрипт для парсинга сайта.
Начал с отзывов и попробовал phpQuery, далее пробовал xPath, но она не всегда корректно парсит и в принципе не особо удобна(те кто знает синтаксис jQuery меня поймут). HTML DOM Parser вообще работала через раз и отказывалась разбирать дерево сайта, с которым я работал, поэтому я особо запариваться не стал и вернулся к phpQuery. Для меня она наиболее оптимальна. Хотя раньше работал именно с html dom parser’ом и всё было ок, видимо phpQuery более гибкий.
Да и вообще, у всех библиотек есть главный минус — скорость работы. Я даже хотел из-за этого на питон переходить.
Единственное что, я использую её не через функцию file_get_contents, а через curl. (но это уже совсем другая история)
Наполнить сайт контетом — вещь не простая. Как реализовать эту функцию, вопрос не простой. У меня как раз поступил заказ, у вас нашел самое простое объяснение. Спасибо за ваш труд!
Пожалуйста)
Рад что смог вам помочь)