Что-то ещё?
Для PHP существуют ещё десятки разнообразных библиотек и инструментов для парсинга, но в этой статье мы рассмотрели только самые интересные, функциональные и производительные.
Подробнее о других способах парсинга средствами PHP можно прочитать в соответствующей теме на StackOverflow.
Если вы не используете PHP, то можете ознакомится с кратким списком похожих инструментов для других языков программирования:
C :htmlcxx, libxml ;
Python:lxml, BeautifulSoup, html5lib;
Java:JSOUP, TagSoup;
Ruby:Nokogiri, Oga, Rubyful Soup;
Perl:HTML::TokeParser, HTML::Parser, HTML::SimpleParse;
.NET: Html Agility Pack;
Swift:libxml 2, Hpple;
Ассемблер:AsmXml.
Htmlsql
htmlSQL — экспериментальная PHP библиотека, позволяющая манипулировать HTML-разметкой посредством SQL-подобных запросов.
Простейший пример, извлекающий атрибуты href и title всех ссылок (элементы a) с классом list:
SELECT href,title FROM a WHERE $class == "list"
Как и с обычными mysql_ функциями, воспользовавшись методами fetch_array() или fetch_objects(), мы можем получить результат выполнения данного запроса в виде привычного ассоциативного массива или объекта.
Стоит также упомянуть о высоком быстродействии htmlSQL: часто она справляется в несколько раз быстрее phpQuery или того же Simple HTML DOM.
Тем не менее, для сложных задач вам может не хватить функциональности, а разработка библиотеки давно прекращена. Но даже несмотря на это, она всё ещё представляет интерес для веб-разработчиков: в ряде случаев значительно удобнее использовать язык SQL вместо CSS-селекторов. Особенно когда вы не знаете, что такое CSS-селекторы 😉
Phpquery
Как и Simple HTML DOM, phpQuery является PHP вариантом JQuery, но на этот раз более похожим на своего «старшего javascript-брата».
Портировано почти всё, что есть в JS-фреймворке: поддержка селекторов, атрибутов, манипуляций, обхода, плагинов, событий (в том числе имитации кликов и т.д.) и даже AJAX. Использовать можно как через PHP, так и через командную строку в виде отдельного приложения.
Более того, согласно нашим бенчмаркам, phpQuery оказался в 8 (!) раз быстрее Simple HTML DOM.
Вот небольшой пример на phpQuery, в котором происходит обработка заранее выбранных элементов списка (li):
foreach(pq('li') as $li) {
// Можно вывести различные данные обычным текстом
$tagName = $li->tagName;
$childNodes = $li->childNodes;
// А можно добавить обертку phpQuery (аналог $() в JQuery) и, например, добавить к элементу какой-то класс
pq($li)->addClass('my-second-new-class');
}
Подробную документацию и больше примеров найдете на официальной странице в Google Code.
Simple html dom
Simple HTML DOM — PHP-библиотека, позволяющая парсить HTML-код с помощью удобных jQuery-подобных селекторов.
Она лишена главного недостатка XPath — библиотека умеет работать даже с невалидным HTML-кодом, что значительно упрощает работу. Вы также забудете о проблемах с кодировкой: все преобразования выполняются автоматически.
Xpath и dom
DOM и XPath не являются библиотеками в привычном смысле этого слова, это стандартные модули, которые встроены в PHP начиная с пятой версии. Именно отсутствие необходимости использовать сторонние решения делает их одними из лучших инструментов для парсинга HTML страниц.
На первый взгляд может показаться, что низкий порог входа — это не о них, некоторые места и вправду являются весьма сложными. Но это только на первый взгляд: стоит только немного разобраться с синтаксисом и базовыми принципами, как XPath тут же станет для вас инструментом для парсинга номер один.
Вот, например, код с использованием DOM и XPath, который ищет в разметке все теги и модифицирует их атрибуты src
:
Как правильно организовать парсер php?
Пишу парсер для одного сайта. На сайте есть авторизация, это сильно усложняет, т.к. я в php новичок
<?php
include_once('simple_html_dom.php');
function curl_get($url, $referer = 'http://www.google.com', $fields = []) {
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_HEADER, 0);
curl_setopt($ch, CURLOPT_USERAGENT, "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:69.0) Gecko/20220101 Firefox/69.0");
curl_setopt($ch, CURLOPT_REFERER, $referer);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$data = curl_exec($ch);
$dom = str_get_html($data);
$token = $dom->find('#big_login input[name="authenticity_token"]');
foreach($token as $tok) {
$fields["authenticity_token"] = $tok->value;
}
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($fields));
curl_close($ch);
return $data;
}
$url_auth = 'https://********/users/sign_in';
$auth_data = [
"user[email]" => "[email protected]",
"user[password]" => "pass",
"user[remember_me]" => "on",
"authenticity_token" => "",
"utf8" => "✓"
];
$page = curl_get($url_auth, 'http://www.google.com', $auth_data);
echo $page;
?>
По идее после вывода должна выводиться страница, где я авторизован, но нет, выводиться просто страница с авторизацией.
На сайте есть такой токен
Который я паршу в итоге, я так понял его тоже нужно отправлять, при авторизации
Что я делаю не так и почему выбивает страницу авторизации?
Как правильно парсить разные страницы на сайте с авторизацией?
Здравствуйте.
Есть необходимость распарсить некоторые данные в своём аккаунте одного сервиса. Для авторизации использую cURL, авторизоваться получилось хорошо, но возникло затруднение на стадии, когда надо ходить по нескольким категориям, в каждой категории есть пэйджер, где может быть ещё десяток страниц. Получается, что file_get_contents() использовать я не могу, а для каждой следующей страницы открывать новую сессия curl – на мой взгляд слишком жирно и по коду в том числе… Как аккуратно решить мою задачу? Как вообще люди поступают в таком случае? Может я какой-то момент упустил? Можете ли вы показать пример, как это сделать?
UPD:
Я надеялся, просто, что есть какая-то возможность авторизоваться, закрыть сессию cURL и далее уже обрабатывать данные, брать другие страницы и так далее вне сессии…
Регулярные выражения
Даже не смотря на то, что «регулярки» — это первое, что приходит на ум, использовать их для настоящих проектов не стоит.
Да, с простыми задачами регулярные выражения справляются лучше всех, но его использование значительно затрудняется, когда нужно спарсить большой и сложный кусок HTML-кода, который, к тому же, не всегда соответствует какому-то определенному шаблону и вообще может содержать синтаксические ошибки.
Вместо «допиливания» своего регулярного выражения при каждом малейшем изменении кода рекомендуем использовать инструменты ниже — это и проще, и удобнее, и надежнее.
Вывод
В своем мини-исследовании мы пришли к выводу, что в большинстве случаев для парсинга лучше использовать библиотеку phpQuery: она быстрая, функциональная и современная.
С другой стороны, для совсем простых задач логично было бы использовать стандартные модули PHP, такие как XPath, DOM или, на крайний случай, регулярные выражения.