Отримання даних з XML

Отримання даних з XML, парсинг сайту та порівняння цін на товари

Якщо у вас є свій інтернет-магазин і ви хочете час від часу перевіряти, чи не змінилися ціни на товари у виробника (постачальника), то в нагоді може знадобитися наступний код PHP:

<?php

// Функція для отримання HTML-коду сторінки за URL
function getHtmlContent($url) {
    $ch = curl_init();
    curl_setopt($ch, CURLOPT_URL, $url);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
    $html = curl_exec($ch);
    curl_close($ch);
    return $html;
}

// Функція для отримання ціни з HTML-коду
function getPrice($html, $xpathQuery) {
    $dom = new DOMDocument();
    @$dom->loadHTML($html);
    $xpath = new DOMXPath($dom);
    $priceNode = $xpath->query($xpathQuery)->item(0);
    if ($priceNode) {
        $price = preg_replace('/\D/', '', $priceNode->textContent); // Видаляє всі букви та залишає тільки цифри
        return $price;
    }
    return null;
}

// Функція для отримання назви товару з HTML-коду
function getTitle($html) {
    $dom = new DOMDocument();
    @$dom->loadHTML($html);
    $titleNode = $dom->getElementsByTagName('title')->item(0);
    return $titleNode ? trim($titleNode->textContent) : null;
}

// Завантаження XML-файлу
$xml = simplexml_load_file('priselist.xml');

// Масив для зберігання результатів
$results = [];

foreach ($xml->url as $urlSet) {
    $manufacturerUrl = isset($urlSet->manufacturer) ? (string)$urlSet->manufacturer : null;
    $mysiteUrl = isset($urlSet->mysite) ? (string)$urlSet->mysite : null;
    $msUrl = isset($urlSet->ms) ? (string)$urlSet->ms : null;
    $csUrl = isset($urlSet->cs) ? (string)$urlSet->cs : null;

    // Отримання HTML-коду сторінок
    $manufacturerHtml = $manufacturerUrl ? getHtmlContent($manufacturerUrl) : null;
    $mysiteHtml = $mysiteUrl ? getHtmlContent($mysiteUrl) : null;
    $msHtml = $msUrl ? getHtmlContent($msUrl) : null;
    $csHtml = $csUrl ? getHtmlContent($csUrl) : null;

    // Отримання цін
    $manufacturerPrice = $manufacturerHtml ? getPrice($manufacturerHtml, '//div[@class="rm-product-center-price"]/span') : null;
    $mysitePrice = $mysiteHtml ? getPrice($mysiteHtml, '//div[@class="PricesalesPrice vm-display vm-price-value"]/span[@class="PricesalesPrice"]') : null;
    $msPrice = $msHtml ? getPrice($msHtml, '//div[@class="PricesalesPrice vm-display vm-price-value"]/span[@class="PricesalesPrice"]') : null;
    $csPrice = $csHtml ? getPrice($csHtml, '//div[@class="PricesalesPrice vm-display vm-price-value"]/span[@class="PricesalesPrice"]') : null;

    // Отримання назв товарів
    $manufacturerTitle = $manufacturerHtml ? getTitle($manufacturerHtml) : null;
    $mysiteTitle = $mysiteHtml ? getTitle($mysiteHtml) : null;
    $msTitle = $msHtml ? getTitle($msHtml) : null;
    $csTitle = $csHtml ? getTitle($csHtml) : null;

    // Додавання результатів в масив
    $results[] = [
        'title' => [
            'manufacturer' => $manufacturerTitle,
            'mysite' => $mysiteTitle,
            'ms' => $msTitle,
            'cs' => $csTitle
        ],
        'price' => [
            'manufacturer' => $manufacturerPrice,
            'mysite' => $mysitePrice,
            'ms' => $msPrice,
            'cs' => $csPrice
        ]
    ];
}

// Виведення результатів у вигляді таблиці
echo "<table border='1'>";
foreach ($results as $index => $result) {
    echo "<tr><th colspan='3'>URL Set " . ($index + 1) . "</th></tr>";
    echo "<tr><th>Site</th><th>Title</th><th>Price</th></tr>";

    $prices = $result['price'];
    $basePrice = $prices['manufacturer'];

    foreach (['manufacturer', 'mysite', 'ms', 'cs'] as $site) {
        if (isset($prices[$site])) {
            $price = $prices[$site];
            $color = ($price !== null && $price === $basePrice) ? 'yellow' : 'red';
            echo "<tr>";
            echo "<td>{$site}</td>";
            echo "<td>{$result['title'][$site]}</td>";
            echo "<td style='background-color: {$color};'>{$price}</td>";
            echo "</tr>";
        }
    }

    echo "<tr><td colspan='3' style='background-color: #000; height: 1px;'></td></tr>"; // Розділювач
}
echo "</table>";
?>

За допомогою цього коду ви можете пройтись по посиланням, які містить в собі XML-файл і виконати парсинг сторінок, витягнувши з HTML ціну і назву товара. А потім ці дані записуються в таблицю і відбувається порівняння цін. Якщо ціни не співпадають, то комірка зафарбовується в червоний колір. Якщо ціни однакові - то комірка буде жовтого кольору.

Таким чином, можна слідкувати за цінами товарів на сайті виробника або постачальника, і оперативно змінювати їх в своєму інтернет-магазині.

Звісно що краще працювати з XML файлами які надаються постачальниками і в яких одразу вказуються і опис і вся інша інформація про товари. Але в моєму випадку такого файлу у виробника не було. Тому й довелося шукати варіант швидкого отримання актуальних цін з чужого сайту і порівняння їх з цінами мого інтернет-магазину.

Приклад файлу XML

<?xml version="1.0" encoding="UTF-8"?>
<urlset>
<url>
  <manufacturer>Посилання 1 на товар 1</manufacturer>
  <mysite>Посилання 2 на товар 1</mysite>
</url>
<url>
  <manufacturer>Посилання 1 на товар 2</manufacturer>
  <mysite>Посилання 2 на товар 2</mysite>
</url>
</urlset>

В даному прикладі:

  • manufacturer - тег в якому вказується посилання на товар виробника;
  • mysite - тег в якому вказується посилання на власний інтернет-магазин.

Main Menu