Приветствую всех. Недавно я взял заказ, где нужно было автоматически подтягивать данные на сайт (проще говоря — написать парсер).
Содержание статьи:
Так как я работаю на php, то мой взор пал на библиотеку phpQuery. Я, конечно, соглашусь, что есть множество других библиотек, в том числе и встроенная в php по умолчанию, но для рядового программиста, который подрабатывает фрилансом на выходных, нужно некое чудо. К счастью, всеми нами движет лень. Одного чеха лень привела к созданию phpQuery.
Документации на русском языке к данной библиотеке я не нашел (может быть плохо искал?). Найдя кучу вопросов от новичков на форумах, и не имея возможности прочитать документацию на английском, я задумался о написании этой статьи. Прошу учесть, что статья написана, в основном, для новичков.
PhpQuery не самая быстрая библиотека, но одна из. С новыми версиями php она почти незаметна. Основная нагрузка, как и раньше, ложится на подгрузку страниц.
У неё полно возможностей, о которых не говорится во многих русскоязычных руководствах.
Некоторые программисты, так и не разобравшись с phpQuery, бегут создавать собственные библиотеки (прямо как наши коллеги из мира js). Да, у этой библиотеки есть главный недостаток — код устарел, но вполне себе работает.
Новичкам довольно сложно сходу понять работу phpQuery. Но я постараюсь максимально «разжевать» все сложные моменты.
Многие методы это библиотеки нацелены на работу с Dom, как будто мы работаем на jQuery. Да и названия у данных библиотек максимально похожи.
И так. Для начала нам нужно определиться с сайтом, с которого мы будем забирать HTML код. К слову, это не обязательно должен быть сайт. Если у нас уже есть html (xml) в файле (переменной), то можем подгрузить и оттуда.
Далее нам нужно передать полученный код обработчику phpQuery
Метод «newDocument()» вернет dom объект, с которым мы можем работать.
Теперь мы можем что-то найти в этом dom объекте. Давайте представим, что мы подтягиваем страничку сайта, где есть такой блок:
В данном примере есть строчка со ссылкой на бренд, название бренда, название продукта, его описание, ID и цена.
Попробуем получить все вышеперечисленные данные.
На выходе получаем вот такой массив:
PhpQuery очень удобная библиотека, но, к сожалению, слишком тяжелая. Так что после прохода по элементам рекомендуется выгружать документ:
Несмотря на удобство библиотеки, советую к ней не привыкать. Для решения мелких задач она подходит, наверное, лучше всех. Но это все же немного устаревшая библиотека.
В этой библиотеке есть возможность добавлять элементы «на лету». Но эту тему мы затронем в следующей статье.
Содержание статьи:
Предисловие
Так как я работаю на php, то мой взор пал на библиотеку phpQuery. Я, конечно, соглашусь, что есть множество других библиотек, в том числе и встроенная в php по умолчанию, но для рядового программиста, который подрабатывает фрилансом на выходных, нужно некое чудо. К счастью, всеми нами движет лень. Одного чеха лень привела к созданию phpQuery.
Документации на русском языке к данной библиотеке я не нашел (может быть плохо искал?). Найдя кучу вопросов от новичков на форумах, и не имея возможности прочитать документацию на английском, я задумался о написании этой статьи. Прошу учесть, что статья написана, в основном, для новичков.
Приступим
PhpQuery не самая быстрая библиотека, но одна из. С новыми версиями php она почти незаметна. Основная нагрузка, как и раньше, ложится на подгрузку страниц.
У неё полно возможностей, о которых не говорится во многих русскоязычных руководствах.
Некоторые программисты, так и не разобравшись с phpQuery, бегут создавать собственные библиотеки (прямо как наши коллеги из мира js). Да, у этой библиотеки есть главный недостаток — код устарел, но вполне себе работает.
Начало работы
Новичкам довольно сложно сходу понять работу phpQuery. Но я постараюсь максимально «разжевать» все сложные моменты.
Многие методы это библиотеки нацелены на работу с Dom, как будто мы работаем на jQuery. Да и названия у данных библиотек максимально похожи.
И так. Для начала нам нужно определиться с сайтом, с которого мы будем забирать HTML код. К слову, это не обязательно должен быть сайт. Если у нас уже есть html (xml) в файле (переменной), то можем подгрузить и оттуда.
/**
Если сайт:
$siteName = "site.com/";
Если файл:
$siteName = "index.html";
*/
$html = file_get_contents("$siteName");
Далее нам нужно передать полученный код обработчику phpQuery
$dom = phpQuery::newDocument($html);
Метод «newDocument()» вернет dom объект, с которым мы можем работать.
Теперь мы можем что-то найти в этом dom объекте. Давайте представим, что мы подтягиваем страничку сайта, где есть такой блок:
<div class="product-essential">
<a class="brand-link" href="https://какой-то_сайт.com/какой-то_бренд" title="Какой-то бренд">
<span class="brand-name">Какой-то бренд</span>
</a>
<div class="product-name">
<h1>Jeans Denim</h1>
</div>
<div class="price-info">
<div class="price-box">
<span class="regular-price" id="product-price-424337">
<span class="price">€ 200</span>
</span>
</div>
</div>
<div class="description">
<span class="product-description">Описание товара</span>
<div class="sku">
<span> ID продукта:</span>
<span>830214303</span>
</div>
</div>
</div>
В данном примере есть строчка со ссылкой на бренд, название бренда, название продукта, его описание, ID и цена.
Практическая часть
Попробуем получить все вышеперечисленные данные.
// Получаем код
$html = file_get_contents("https://какой-то_сайт.com/");
// Получаем объект dom
$dom = phpQuery::newDocument($html);
// Ищем в объекте dom элемент с классом .product-essential, обращаясь к методу find(). Он вмещает в себя все данные о продукте.
foreach($dom->find(".product-essential") as $key => $value){
// Преобразуем dom объект в объект phpQuery. Делаем сие действие с помощью метода pq(); который является аналогом ($) в jQuery.
$pq = pq($value);
// Находим в этом элементе элемент с классом .brand-link и получаем значение атрибута "href" с помощью метода attr();
$productHref[$key]["brand-href"] = $pq->find(".brand-link")->attr("href");
// Получаем название бренда. Оно находится в строке <span class="brand-name">Какой-то бренд</span>.
// Мы можем получить текст, содержащийся в <span> и других тегах с помощью метода text();
$productHref[$key]["brand-name"] = $pq->find(".brand-name")->text();
// Далее нам необходимо получить название товара.
// Помимо указания класса элемента, мы можем указать имя вложенного элемента.
// В данном случае имя бренда находится в элементе <h1>, который находится в элементе <div class="brand-name">
$productHref[$key]["product-name"] = $pq->find(".product-name h1")->text();
// PhpQuery позволяет перечислять классы нескольких, вложенных друг в друга, элементов.
// Только не забывайте следить за порядком!
// Тут мы получаем цену товара.
$productHref[$key]["product-price"] = $pq->find(".price-info .price-box .regular-price .price")->text();
// Получаем описание товара
$productHref[$key]["product-description"] = $pq->find(".description .product-description")->text();
// Так же есть возоможность шагать по элементам.
// Деется это с помощью метода next();
// В данном случае мы получим только числовой идентификатор без лишних строк.
$productHref[$key]["product-id"] = $pq->find(".description .sku span")->next()->text();
}
На выходе получаем вот такой массив:
Array
(
[0] => Array
(
[brand-href] => https://какой-то_сайт.com/какой-то_бренд
[brand-name] => Какой-то бренд
[product-name] => Jeans Denim
[product-price] => € 200
[product-description] => Описание товара
[product-id] => 830214303
)
)
Заключение
PhpQuery очень удобная библиотека, но, к сожалению, слишком тяжелая. Так что после прохода по элементам рекомендуется выгружать документ:
phpQuery::unloadDocuments();
Несмотря на удобство библиотеки, советую к ней не привыкать. Для решения мелких задач она подходит, наверное, лучше всех. Но это все же немного устаревшая библиотека.
В этой библиотеке есть возможность добавлять элементы «на лету». Но эту тему мы затронем в следующей статье.