В новой записи мы попрактикуемся в написание парсера с возможностью записи результата в XML формате. Мы будем использовать PHP+Curl для парсинга, phpQuery для разбора страниц и сохранять данные в XML файл. Все данные я буду собирать для создания разметки для Турбо Магазина Яндекс.
Урок по phpQuery — https://prog-time.ru/parsing-php-biblioteka-phpquery/
Библиотека phpQuery — https://code.google.com/archive/p/phpquery/downloads
Уроки по Curl — https://prog-time.ru/parsing-php-ottachivaem-curl/
Функции для отладки парсинга
function vardump($str){
echo "<pre>";
var_dump($str);
echo "</pre>";
}
/* для указания кодировки utf-8 */
header('Content-type: text/html; charset=utf-8');
setlocale(LC_ALL, 'ru_RU.UTF-8');
/* для вывода ошибок */
ini_set('error_reporting', E_ALL);
ini_set('display_errors', 1);
ini_set('display_startup_errors', 1);
Функция для парсинга через Curl
function parser($urlPage) {
$ch = curl_init($urlPage);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($ch, CURLOPT_HEADER, false);
$result = curl_exec($ch);
curl_close($ch);
return $result;
}
Код для парсинга и получения информации
require __DIR__ . "/phpQuery-onefile.php";
$urlPage = "https://elektronika.store/product/apple-iphone-11-64gb-product-red";
$result = parser($urlPage);
$pq = phpQuery::newDocument($result);
/* важные параметры для товара */
$arrMainParams = [
"url" => "https://prog-time.ru",
"price" => preg_replace("/[^0-9]*/", "", $pq->find("#price-field")->text()),
"oldprice" => preg_replace("/[^0-9]*/", "", $pq->find("#old-price-field")->text()),
'currencyId' => 'RUR',
'categoryId' => '21',
'store' => 'false',
'pickup' => 'true',
'delivery' => 'true',
'vendor' => 'Elektronika',
'name' => $pq->find("h1")->text(),
'description' => trim($pq->find("#tab-description-content")->text()),
];
/* получаем дополнительные параметры для */
$listParamsProduct = $pq->find(".product-properties p");
foreach($listParamsProduct as $param) {
$elemParam = pq($param);
$arrElemParam = explode(":", $elemParam->text());
if(count($arrElemParam) > 1) {
$arrDopParams[] = [
"name" => trim($arrElemParam[0]),
"value" => trim($arrElemParam[1])
];
}
}
/* получаем изображения */
$listImages = $pq->find("a.js-varaint-image");
foreach($listImages as $image) {
$elemImage = pq($image);
$arrListImages[] = $elemImage->attr("data-image");
}
$offers = [
[
'id' => '123',
'listImages' => $arrListImages,
'listMainParams' => $arrMainParams,
'listDopParams' => $arrDopParams
]
];
Код для формирования XML файла в PHP
// Создаём XML-документ
$dom = new DOMDocument('1.0', 'utf-8');
// Создаём корневой элемент <offers>
$root = $dom->createElement('offers');
$dom->appendChild($root);
foreach($offers as $valueParam) {
// Создаём узел <offer>
$offer = $dom->createElement('offer');
// Добавляем дочерний элемент для <offers>
$root->appendChild($offer);
// Устанавливаем атрибут id для узла <offer>
$offer->setAttribute('id', $valueParam['id']);
foreach($valueParam["listMainParams"] as $key=>$val) {
$params = $dom->createElement($key, $val);
$offer->appendChild($params);
}
foreach($valueParam["listImages"] as $image) {
$params = $dom->createElement("picture", $image);
$offer->appendChild($params);
}
foreach($valueParam["listDopParams"] as $dopParam) {
$params = $dom->createElement("param", $dopParam["value"]);
$params->setAttribute('name', $dopParam["name"]);
$offer->appendChild($params);
}
}
// Сохраняем полученный XML-документ в файл
$dom->save('offers.xml');