Написание парсера на PHP+Curl. Сохранение результата в XML файле — PROG-TIME

Написание парсера на PHP+Curl. Сохранение результата в XML файле

20.03.2022
Содержание:

В новой записи мы попрактикуемся в написание парсера с возможностью записи результата в 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');