Парсер* для OZON.ru

Парсер предназначен для работы с XML-каталогами товаров интернет-магазина OZON.ru.

Скрипты парсера написаны на PHP и XSLT и существенно упрощают представление товаров с OZON.ru на вашем сайте. Для установки скачайте и распакуйте дистрибутив парсера:

Версия 1.30: скачать

Системные требования:
PHP версии 5 или выше, с установленными пакетами CURL, DOM, XSL и iconv (требуется, только если кодировка вашего сайта отлична от UTF-8). Как правило, данные пакеты включены по умолчанию на большинстве веб-серверов.

Также необходимо, чтобы ваш сайт имел доступ к внешним ресурсам в интернете для скачивания данных с сервера OZON.ru.

Чтобы проверить, соответствует ли ваша система всем требованиям, запустите скрипт bin/check.php, который выполнит все необходимые проверки. Если вы устанавливаете дистрибутив парсера с помощью инсталлятора, все необходимые проверки будут выполнены автоматически.

Установка

Парсер может быть установлен двумя способами:

  1. С помощью специального скрипта-инсталлятора.
  2. Распакован из обычного ZIP-архива.

1. Установка с помощью скрипта-инсталлятора

Мы рекомендуем использовать этот способ установки, поскольку он снижает вероятность ошибок при размещении файлов парсера на вашем сайте.

Шаг 1. Скачать скрипт-инсталлятор

Для выполнения этого типа установки вам необходимо скачать и распаковать архив со скриптом-инсталлятором . После распаковки вы увидите следующие файлы (предполагается, что архив был распакован на диск C:\)

C:\┐
   └ ozonru-parser-1.30\┐
                       ├ ozonru-parser-1.30.php
                       └ readme.html

Файл ozonru-parser-1.30.php - и есть скрипт-инсталлятор.

Шаг 2. Скопировать скрипт-инсталлятор на ваш сайт

Используя ваш FTP-клиент (или другой способ) создайте на вашем сайте папку ozonru-parser/. Путь, по которому вы создадите эту папку, зависит от настроек вашего веб-сервера, однако нужно выбрать место так, чтобы скрипты (страницы) вашего сайта имели доступ к этой папке и файлам внутри. Лучше всего, если вы назначите ей права 0777 (или -rwxrwxrwx), чтобы она была доступна для создания новых файлов и папок как через FTP, так и самим парсером.

Скопируйте содержимое папки С:\ozonru-parser-1.30\ к себе на сайт в папку, которую вы создали: ozonru-parser/.

Например, путь на сервере, где лежат файлы вашего сайта, может быть следующим: /home/mysite.ru/. Тогда, после копирования вы увидите следующую структуру файлов:

/┐
 └ home/┐
        └ mysite.ru/┐
                    ├ другие файлы и папки вашего сайта
                    ...
                    └ ozonru-parser/┐
                                    ├ ozonru-parser-1.30.php
                                    └ readme.html

Шаг 3. Запустить скрипт-инсталлятор

Для завершения установки осталось только запустить скрипт-инсталлятор. Для запуска обратитесь к нему с помощью вашего браузера, набрав в адресной строке следующий адрес: http://mysite.ru/ozonru-parser/ozonru-parser-1.30.php (предполагается, что имя вашего сайта - mysite.ru).

После запуска скрипт выполнит все необходимые проверки системы, наличие необходимых библиотек для работы парсера, а также доступность XML-каталогов OZON.ru для скачивания. Если в вашей системе не хватает каких-либо библиотек или условий для работы парсера, инсталлятор сообщит об этом. После того, как проблема будет исправлена, повторно запустите инсталлятор.

Если все проверки прошли успешно, файлы парсера будут размещены по указанному адресу, и парсер будет готов к работе.

2. Установка из ZIP-архива

В случае, если установка с помощью скрипта-инсталлятора по каким-то причинам вас не устраивает, можно установить парсер из ZIP-архива.

Шаг 1. Скачать дистрибутив парсера

Скачайте ZIP-архив парсера ozonru-parser-1.30.zip и распакуйте его у себя на компьютере, например, в папку C:\ozonru-parser-1.30\.

Если все сделано правильно, в выбранной папке вы увидите следующие файлы и папки:

C:\┐
   └ ozonru-parser-1.30\┐
                       ├ bin\
                       ├ src\...
                       ├ test\...
                       ├ web\...
                       └ readme.html

Шаг 2. Скопировать файлы парсера на ваш сайт

Используя ваш FTP-клиент (или другой способ) создайте на вашем сайте папку ozonru-parser/ для файлов парсера. Путь, по которому вы создадите эту папку, зависит от настроек вашего веб-сервера, однако нужно выбрать место так, чтобы скрипты (страницы) вашего сайта имели доступ к этой папке и файлам внутри. Лучше всего, если вы назначите ей права 0777 (или -rwxrwxrwx), чтобы она была доступна для создания новых файлов и папок как через FTP, так и самим парсером.

Обратите внимание, что на веб-сервере имя папки указано без номера версии ("1.30"). Это сделано специально, чтобы потом, при выходе новой версии парсера, можно было легко обновить его файлы.

Скопируйте содержимое папки С:\ozonru-parser-1.30\ к себе на сайт в папку, которую вы создали: ozonru-parser/.

Например, путь на сервере, где лежат файлы вашего сайта, может быть следующим: /home/mysite.ru/. Тогда, после копирования вы увидите следующую структуру файлов:

/┐
 └ home/┐
        └ mysite.ru/┐
                    ├ другие файлы и папки вашего сайта
                    ...
                    └ ozonru-parser/┐
                                    ├ bin/
                                    ├ src/...
                                    ├ test/...
                                    ├ web/...
                                    └ readme.html

Обратите внимание, что папка ozonru-parser/ должна быть доступна для записи, потому что парсер при работе будет создавать временные файлы. Также проверьте, что файлы парсера доступны для чтения, чтобы ваши собственные скрипты могли получить к ним доступ.

Итак, парсер готов к дальнейшей работе.

Примеры использования

Скрипты можно использовать как в составе веб-сайта (для генерации страниц), так и для самостоятельно работы с XML-каталогами OZON.ru. Далее приведены примеры основных способов использования скриптов парсера. Некоторые из них просты и требуют лишь базовых знаний PHP, другие — сложнее и требуют дополнительных знаний XSL и прочих веб-технологий.

Исходные тексты PHP-скриптов, XSL- и CSS-файлов, упоминаемых в примерах, можно найти в дистрибутиве парсера в папках web/example(1-7).

  1. Пошаговое руководство: как создать каталог товаров по какой-либо конечной ветке XML-каталога
  2. Пошаговое руководство: как настроить вид списка товаров
  3. Пошаговое руководство: Как настроить показ подробной информации о товаре
  4. Готовый сайт
  5. Использование классов парсера отдельно от сайта
  6. Пошаговое руководство: автоматическое обновление
  7. Пошаговое руководство: импорт в базу данных

1. Как создать каталог товаров по какой-либо конечной ветке XML-каталога

Выполнив все шаги данного руководства, вы получите список товаров из конечной ветки XML-каталога OZON.ru на одной из страниц вашего сайта.

Шаг 1. Скачать и установить дистрибутив парсера

Выберите подходящий для вас способ установки парсера и, следуя шагам из описания, установите парсер на ваш сайт (подробнее об установке можно прочитать в разделе «Установка»).

Шаг 2. Подключить парсер к вашему сайту

Теперь, чтобы получить итоговый результат — каталог товаров на одной из страниц вашего сайта, осталось подключить парсер к сайту.

Предположим, что вы хотите представить список книг о CRM.

Откройте на редактирование страницу вашего сайта, на которой вы хотите представить список товаров. Предположим, что это страница с именем index.php, которая находится в папке /home/mysite.ru/books.php на вашем сайте.

Подключите файл стилей web/ozon.css к заголовку страницы:

<html>
    <head>
        <title>Книги о CRM | Название вашего сайта</title>
        <link rel="stylesheet" type="text/css" href="/ozonru-parser/web/ozon.css" />
        ...
    </head>
    <body>
    ...

Добавьте следующий PHP-код в то место вашей страницы, где вы хотите представить список товаров из выбранной ветки XML-каталога Озон.ру:

    <body>
        ...

<?php
require_once 'ozonru-parser/src/OzonCatalog.php';

// каталог третьего уровня "Маркетинг и реклама",
// к которому относятся книги о CRM
$catalog = new OzonCatalog('business_catalog/12292'); 

$catalog->transform('ozonru-parser/src/xsl/offers.xsl',
    array('PARTNER' => '<YOUR-PARTNER-ID>', // ваш партнерский идентификатор 
          'categoryId' => 1099944             // ID категории книг о CRM
));
?>
        ...
    </body>
</html>

Обратите внимание, мы использовали относительный путь к файлу парсера — ozonru-parser/src/OzonCatalog.php. Если ваш файл, в который вы добавляете код парсера, находится по другому пути, вам нужно соответствующе изменить и путь к OzonCatalog.php.

Если все было сделано верно, на выбранной вами странице сайта появится список книг о CRM. Результат будет примерно следующим:

Результат работы парсера: товары из выбранной ветки XML-каталога OZON.ru

Если списка книг не появилось, проверьте, правильно ли вы указали путь к файлам парсера в PHP-коде.

Шаг 3. Настроить кодировку

По умолчанию каталог товаров выдается в кодировке UTF-8. Если ваш сайт использует другую кодировку (например, windows-1251), для корректного представления информации о товарах необходимо передать дополнительный параметр:

<?php
require_once 'ozonru-parser/src/OzonCatalog.php';

// каталог третьего уровня "Маркетинг и реклама"
// к которому относятся книги о CRM
$catalog = new OzonCatalog('business_catalog/12292'); 

$catalog->transform('ozonru-parser/src/xsl/offers.xsl', array(
    'PARTNER' => '<YOUR-PARTNER-ID>',     // ваш партнерский идентификатор
    'categoryId' => 1099944,      // ID категории книг о CRM
    'encoding' => 'windows-1251'  // кодировка вашего сайта
));
?>

Шаг 4. Настроить постраничный вывод товаров

Количество товаров в категории может быть довольно большим, и поэтому для вывода информации о товарах используется постраничный вывод. По умолчанию, парсер выводит товары по 20 штук на странице, начиная с первой страницы.

Добавим обработчик номера страницы, а также изменим количество товаров — 15 штук на странице. Номер страницы передается с помощью GET-параметра page, который нам надо считать и передать в парсер при выводе списка товаров:

<html>
    <head>
        <title>Книги о CRM | Название вашего сайта</title>
        <link rel="stylesheet" type="text/css" href="../ozon.css" />
    </head>
    <body>
<?php
require_once dirname(__FILE__).'/../config.php';

$page = 1;
if (array_key_exists('page', $_GET))
    $page = trim($_GET['page']);

// каталог третьего уровня "Маркетинг и реклама",
// к которому относятся книги о CRM
$catalog = new OzonCatalog('business_catalog/12292'); 

$catalog->transform(dirname(__FILE__).'/../../src/xsl/offers.xsl', 
    array('PARTNER' => '[YOUR-PARTNER-ID]', // ваш партнерский идентификатор
          'categoryId' => 1099944,          // ID категории книг о CRM
          'encoding'=>'windows-1251',       // кодировка
'PAGENUM'=>$page, // номер страницы 'PAGESIZE'=>15 // количество товаров на странице
)); ?> </body> </html>

Шаг 5. Дополнительная настройка параметра страницы

При использовании в контексте некоторых CMS бывает необходимо изменить название параметра в адресе, через который передается номер страницы. По умолчанию используется название page. В примере ниже заменим его на p.

<html>
    <head>
        <title>Книги о CRM | Название вашего сайта</title>
        <link rel="stylesheet" type="text/css" href="../ozon.css" />
    </head>
    <body>
<?php
require_once dirname(__FILE__).'/../config.php';

$page = 1;
if (array_key_exists('page', $_GET))
    $page = trim($_GET['page']);

// каталог третьего уровня "Маркетинг и реклама",
// к которому относятся книги о CRM
$catalog = new OzonCatalog('business_catalog/12292'); 

$catalog->transform(dirname(__FILE__).'/../../src/xsl/offers.xsl', 
    array('PARTNER' => '[YOUR-PARTNER-ID]', // ваш партнерский идентификатор
          'categoryId' => 1099944,          // ID категории книг о CRM
          'encoding'=>'windows-1251',       // кодировка
          'PAGENUM'=>$page,                 // номер страницы
          'PAGESIZE'=>15,                   // количество товаров на странице
          'PAGE_PARAM_NAME'=>'p'            // имя параметра страницы
));
?>
    </body>
</html>

Далее можно перейти к настройке вида списка товаров.

2. Как настроить вид списка товаров

Внешний вид списка товаров зависит от двух вещей:

  1. HTML-верстки — конкретных HTML-тэгов, используемых для представления данных о товаре.
  2. Стилей (CSS), соответствующих тем или иным тэгам.

Начнем с простого — с CSS.

Шаг 1. Изменить CSS

С помощью CSS можно влиять на тип и размер шрифта, величину отступов, цвет текста и фона, выравнивание текста и прочие параметры. Чтобы изменения затрагивали только список товаров (а не весь контент вашего сайта), следует дописать новые или изменить существующие (в случае, если вы используете стили из файла web/ozon.css) стили тэгов, отмеченные классом ozonru-parser — это класс контейнера, в котором содержаться все элементы списка товаров.

Откройте в редакторе файл web/ozon.css (если вы распаковали архив с дистрибутивом парсера так, как это было написано в примере 1, файл стилей расположен в C:\ozonru-parser-1.30\web\ozon.css) и добавьте в него следующие стили.

Поменяем шрифт названия товара — сделаем его больше и другого цвета:

.ozonru-parser h2 { font-size: 150%; margin: 0 0 1ex 0; }
.ozonru-parser h2 a { color: #F90; text-decoration: none; 
    border-bottom: 1px dashed #F90; }
.ozonru-parser h2 a:visited { color: #09F; border-bottom-color: #09F; }

Также изменим стиль имени автора — уберем курсив и увеличим размер букв:

.ozonru-parser .offer .author { font-size: 115%; font-family: sans-serif; 
    font-style: normal; }

Переместим изображение товара в правую сторону и уменьшим его:

.ozonru-parser .offer .cart { float: right; margin: 0 0 0 0.75em; }
.ozonru-parser .offer .cart img { width: 88px; }

Добавим кнопку "Купить" из логотипов, представленных на сайте OZON.ru; уберем подчеркивание у ссылки с ценой товара:

.ozonru-parser .offer .cart .price { border: none; width: 88px; 
    background: url('http://www.ozon.ru/graphics/img_ass/buttons/button88x31.gif') 
        no-repeat left top; 
    display: block; padding: 33px 0 0 0; font-size: 100%; }
.ozonru-parser .offer .cart .price .words { display: none; }
.ozonru-parser .offer .cart a { text-decoration: none; }

А также полностью уберем вспомогательную информацию об издательстве, ISBN и т.п.:

.ozonru-parser .offer .info { display: none; }
.ozonru-parser .offer ul.tags { display: none; }

Шаг 2. Скопировать измененный файл стилей на сайт

Скопируйте файл C:\ozonru-parser-1.30\web\ozon.css с вашего компьютера на ваш сайт в папку /home/mysite.ru/ozonru-parser/web/. Подробнее о копировании файлов парсера на сайт написано в разделе об установке парсера.

Посмотрим, что получилось:

Результат работы парсера после внесения изменений в CSS-файл

Если у вас получился другой результат, проверьте, все ли изменения вы внесли в web/ozon.css, а также в правильное ли место на вашем сайте он скопирован.

Шаг 3. Создать новый XSL

Если изменения, которые вы хотите внести во внешний вид списка товаров значительны и не могут быть сделаны средствами CSS, необходимо изменить саму структуру HTML-тэгов. Это делается за счет изменения XSL-файлов, используемых для отображения товаров.

Например, представим список товаров в табличном виде, отсортированном по названию товара в алфавитном порядке. Для этого создадим новый файл web/offertable.xsl:

<?xml version="1.0" encoding="windows-1251"?>
<xsl:stylesheet version="1.0"
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns="http://www.w3.org/1999/xhtml"
    exclude-result-prefixes="">
    
    <xsl:param name="categoryId"/>

    <xsl:variable name="title" select="//category[@id = $categoryId]"/>

    <xsl:include href="../src/xsl/offers.xsl"/>

    <xsl:template match="/">
           <xsl:apply-templates select="//offers"/>
    </xsl:template>

    <xsl:template match="offers">
        <table border="1" cellspacing="0" cellpadding="2">
            <thead>
                <tr>
                    <th>Название</th>
                    <th>?здательство</th>
                    <th>Цена</th>
                </tr>
            </thead>
            <tbody>
                <xsl:for-each select="offer[categoryId/text() = $categoryId]">
                    <xsl:sort select="name"/>
                    <tr>
                        <td><a>
                            <xsl:attribute name="href">
                                <xsl:apply-templates select="url"/>
                            </xsl:attribute>
                            <xsl:value-of select="name"/>
                        </a></td>
                        <td><xsl:value-of select="publisher"/></td>
                        <td><xsl:value-of select="price"/></td>
                    </tr>
                </xsl:for-each>
            </tbody>
        </table>
    </xsl:template>
</xsl:stylesheet>

Шаг 4. Скопировать новый XSL-файл на сайт

Теперь надо скопировать файл web/offertable.xsl на ваш сайт в папку /home/mysite.ru/ozonru-parser/web/ (путь к папке может отличаться, если вы изначально разместили файлы парсера в другом месте).

Шаг 5. Подключить новый XSL-файл к вашему сайту

На странице вашего сайта, к которой уже подключен парсер, внесем следующие изменения:

<?php
require_once 'ozonru-parser/src/OzonCatalog.php';

// каталог третьего уровня "Маркетинг и реклама"
// к которому относятся книги о CRM
$catalog = new OzonCatalog('business_catalog/12292'); 

$catalog->transform('ozonru-parser/web/offertable.xsl', array(
    'PARTNER' => '<YOUR-PARTNER-ID>',     // ваш партнерский идентификатор
    'categoryId' => 1099944,      // ID категории книг о CRM
    'encoding' => 'windows-1251'  // кодировка вашего сайта
));
?>

Откроем страницу в браузере и посмотрим, что у нас получилось:

Результат работы парсера с новым XSL-файлом

3. Как настроить показ подробной информации о товаре

Рассмотрим показ подробной информации о товаре на примере фильмов.

Подробная информация о фильме должна включать:

В случае, если в XML-каталоге представлена информация о названии фильма на языке оригинала, вывести ссылку на страницу поиска информации о данном фильме на IMDb по названию и году выпуска.

Если в каталоге имеются еще какие-либо фильмы данного режиссера, вывести список названий этих фильмов. Также, вывести список фильмов, снятых в том же году в той же стране.

Шаг 1. Создать XSL-файл

Нам потребуется создать новый XSL-файл (подробнее о создании XSL-файлов рассказано в примере 2), который будет отображать всю доступную информацию о фильмах, представленную в XML-каталоге. Сохраним его в папку web/movie.xsl.

<?xml version="1.0" encoding="windows-1251"?>
<xsl:stylesheet version="1.0"
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:php="http://php.net/xsl"
    xmlns="http://www.w3.org/1999/xhtml"
    extension-element-prefixes="php"
    exclude-result-prefixes="">
    
    <xsl:param name="offerId"/>

    <xsl:include href="../src/xsl/core.xsl"/>

    <xsl:template match="offer/title" mode="withprice">
        <a href="movie.php?offerId={parent::offer/@id}">
            <xsl:apply-templates select="."/>
            <xsl:text>, </xsl:text>
            <xsl:value-of select="parent::offer/price"/>
            <xsl:text> руб.</xsl:text>
          </a>
    </xsl:template>

    <xsl:template match="offer">
        <div class="offer">
            <div class="picture">
                <xsl:apply-templates select="picture"/>
            </div>
            <h1>
                <xsl:apply-templates select="title"/>
                <xsl:if test="year">
                    <xsl:text> (</xsl:text>
                    <xsl:value-of select="year"/> 
                    <xsl:text> г.</xsl:text>
                    <xsl:if test="country">
                        <xsl:text>, </xsl:text>
                        <xsl:value-of select="country"/>
                    </xsl:if>
                    <xsl:text>)</xsl:text>
                </xsl:if>
            </h1>
            <xsl:if test="originalName">
                <p><xsl:apply-templates select="originalName"/></p>
            </xsl:if>
            <div class="description">
                <p><xsl:apply-templates select="description"/></p>
                <p>В ролях: <xsl:value-of select="starring"/></p>
            </div>
            <xsl:if test="director">
                <p>
                    <xsl:text>Режиссер: </xsl:text>
                    <strong><xsl:value-of select="director"/></strong>
                    <xsl:text>.</xsl:text>
                </p>
            </xsl:if>
            <p class="buy">
                <a>
                    <xsl:attribute name="href">
                        <xsl:apply-templates select="url" mode="cart"/>
                    </xsl:attribute>

                    <xsl:text> Купить фильм за </xsl:text>
                    <xsl:value-of select="price"/>
                    <xsl:text> руб. на OZON.ru</xsl:text>
                </a>
                <xsl:text> (</xsl:text>
                <xsl:value-of select="orderingTime/ordering"/>
                <xsl:text>)</xsl:text>
            </p>
            <xsl:if test="originalName">
                <p class="imdb">
                    <a>
                        <xsl:attribute name="href">
                            <xsl:text>http://www.imdb.com/search/title?</xsl:text>
                            <xsl:if test="year">
                                <xsl:text>release_date=</xsl:text>
                                <xsl:value-of select="year"/>
                                <xsl:text>-01%2C</xsl:text>
                                <xsl:value-of select="year"/>
                                <xsl:text>-12&amp;</xsl:text>
                            </xsl:if>
                            <xsl:text>title=</xsl:text>
                            <xsl:value-of 
                                select="php:function('urlencode', string(originalName))"/>
                        </xsl:attribute>
                        <xsl:text>
                            Найти дополнительную информацию о фильме на IMDb.com
                        </xsl:text>
                    </a>
                </p>
            </xsl:if>

            <xsl:variable name="director" select="director/text()"/>
            <xsl:variable name="directorMovies" 
                  select="//offer[not(@id = $offerId) and child::director/text() = $director]"/>

            <xsl:if test="count($directorMovies) &gt; 0">
                <p>Другие фильмы <xsl:value-of select="$director"/>: </p>
                <ul>
                    <xsl:for-each select="$directorMovies">
                        <xsl:sort select="title"/>
                        <xsl:sort select="price" data-type="number"/>
                        <li>
                            <xsl:apply-templates select="title" mode="withprice"/>
                        </li>
                    </xsl:for-each>
                </ul>
            </xsl:if>
            
            <xsl:variable name="country" select="country/text()"/>
            <xsl:variable name="year" select="year/text()"/>
            <xsl:variable name="countryYearMovies" 
                  select="//offer[not(@id = $offerId) and child::country/text() = $country and child::year/text() = $year]"/>

            <xsl:if test="count($countryYearMovies) &gt; 0">
                <p>
                    <xsl:text>Другие фильмы, снятые в </xsl:text>
                    <xsl:value-of select="$year"/>
                    <xsl:text> г. в </xsl:text>
                    <xsl:value-of select="$country"/><xsl:text>: </xsl:text>
                </p>
                <ul>
                    <xsl:for-each select="$countryYearMovies">
                        <xsl:sort select="title"/>
                        <xsl:sort select="price" data-type="number"/>
                        <li>
                            <xsl:apply-templates select="title" mode="withprice"/>
                        </li>
                    </xsl:for-each>
                </ul>
            </xsl:if>
        </div>
    </xsl:template>

    <xsl:template match="/">
        <xsl:apply-templates select="//offer[@id = $offerId]"/>
    </xsl:template>
</xsl:stylesheet>

Шаг 2. Создать CSS-файл

Теперь создадим файл со стилями и сохраним его в web/movie.css.

.picture { float: left; margin: 0 1em 1ex 0; }
.buy { background: 
  url('https://www.ozon.ru/graphics/img_ass/buttons/button88x31_white.gif')
    no-repeat left center; padding-left: 100px; line-height: 200%; }
.imdb { background: 
  url('http://g-ecx.images-amazon.com/images/G/01/digital/video/dp/logo-imdb._V7586292_.gif')
    no-repeat 18px center; padding-left: 100px; line-height: 200%; }

Шаг 3. Подключить XSL и CSS файлы к сайту

Добавим в тело страницы, которая должна показывать подробную информацию о фильме, следующий PHP-код:

<?php
require_once dirname(__FILE__).'/../src/xsl/OzonCatalog.php';

ini_set("max_execution_time", "0");

// каталог третьего уровня "Зарубежное кино/Актеры и актрисы"
$path = 'movie_catalog/1095888';
$catalog = new OzonCatalog($path); 

// Фильм "Бойцовский клуб"
$offerId = '3446678';

$catalog->transform('movie.xsl', array(
    'PARTNER' => $PARTNER_ID, // ваш партнерский идентификатор
    'offerId' => $offerId,
    'encoding' => 'windows-1251'
));
?>

В заголовок страницы добавим ссылку на CSS-файл web/movie.css, который мы создали (подробнее о добавлении CSS-файла к вашему сайту написано в примере 2).

В результате на странице должна появиться расширенная информация о фильме, который мы выбрали для отображения:

Подробная информация о товаре из XML-каталога OZON.ru

4. Пример готового сайта

В качестве примера представлена тестовая страница сайта с каталогом GPS-навигаторов, продающихся на OZON.ru. (Файл дистрибутива web/gps.php)

require_once dirname(__FILE__).'/config.php';
require_once dirname(__FILE__).'/../src/Ozon.php';

ini_set("max_execution_time", "0");

// ветка каталога Озон с GPS-навигаторами
$path = 'gps';
$catalog = new OzonCatalog($path);

// вычисление текущей страницы каталога
$page = array_key_exists('page', $_GET) ? trim($_GET['page']) : 1;
if (! preg_match('/[0-9]+/', $page) || $page < 1)
    $page = 1;

// выполнение преобразования XML-каталога в HTML-страницу
$catalog->transform('offers.xsl', array(
    'PAGENUM'=>$page,       // номер текущей страницы
    'PAGESIZE'=>10,         // количество товаров на странице
    'PARTNER'=>$PARTNER_ID  // партнерский идентификатор
));

5. Использование классов парсера отдельно от сайта

В составе парсера есть следующие классы:

Кроме них есть несколько вспомогательных классов:

Рассмотрим использование этих классов подробнее.

Класс Ozon

Класс Ozon предназначен для получения списка каталогов OZON.ru и содержит единственный статический метод:

Пример использования: получение списка каталогов третьего уровня (см. web/example5/ozon_example.php).

<?php
require_once dirname(__FILE__).'/../../src/Ozon.php';

// Получение XML-каталогов OZON.ru третьего уровня 
// в виде массива объектов OzonCatalog
$level3List = Ozon::getCatalogList(3);

print_r($level3List);
?>

Класс OzonCatalog

Данный класс представляет ветку XML-каталога OZON.ru первого, второго или третьего уровня. Ветке каталога соответствует XML-файл (или XML-файл в ZIP-архиве), содержащий описание товаров из данного каталога. Класс содержит следующие методы:

Пример использования: создание объекта OzonCatalog для XML-каталога GPS-навигаторов (web/example5/ozon_catalog_example.php).

<?php
require_once dirname(__FILE__).'/../../src/OzonCatalog.php';

// Ветка каталога OZON.ru с GPS-навигаторами
$catalog = new OzonCatalog('gps');
echo $catalog->getXmlUrl(); 
// напечатает 'http://www.ozon.ru/multimedia/yml/partner/gps.xml'
echo $catalog->getZipUrl();
// напечатает 'http://www.ozon.ru/multimedia/yml/partner/gps.zip'
echo $catalog->getRawUrl();
// напечатает 'gps'

echo $catalog->load();
// напечатает содержимое XML-каталога

echo $catalog->transform(dirname(__FILE__).'/../catalog.xsl');
// напечатает результат работы XSL-скрипта web/catalog.xsl
?>

Класс OzonCatalogInfo

Класс содержит информацию о времени последнего изменения XML-каталога, а также размер соответствующего XML и ZIP файлов. Класс содержит следующие поля и методы:

Класс Cache

Класс предназначен для кэширования чего угодно. В парсере он используется для кэширования содержимого XML-каталогов, результатов XSL-преобразований, а также промежуточных результатов для ускорения работы. Класс содержит следующие поля и методы:

Класс CacheRecord

Класс представляет закэшированный контент и имеет следующие методы:

Класс XSLTransformer

Класс предназначен для выполнения XSL-преобразования содержимого XML-каталогов OZON.ru. Как правило не используется самостоятельно, а только через вызов метода OzonCatalog::transform(). В классе определены следующие методы:

6. Автоматическое обновление

XML-каталоги OZON.ru периодически обновляются (несколько раз в день), поэтому для отображения самой последней информации имеет смысл настроить автоматическое обновление данных в кэше парсера. Для этой цели можно использовать скрипт bin/autoloader.php, который умеет скачивать обновления данных.

Рассмотрим автоматическое обновление информации из XML-каталога по деловой литературе из раздела «Предпринимательство» (business_catalog/12266).

Шаг 1. Запустить скрипт автоматического обновления

Есть два варианта запуска скрипта bin/autoloader.php: из командной строки или через браузер. В первом случае мы передаем путь к XML-каталогу в качестве параметра следующим образом:

php autoloader.php business_catalog/12266

При запуске скрипта через браузер путь к каталогу передается с помощью GET-параметра path:

http://адрес-вашего-сайта.com/путь-к-парсеру/bin/autoloader.php?path=business_catalog%2F12266

Запускать скрипт с помощью браузера может быть удобным, если у вас нет доступа к командной строке на вашем веб-сервере.

Если вы все сделали правильно, появится сообщение, что каталог загружен.


Т.к. XML-каталоги обновляются несколько раз в день, имеет смысл добавить запуск скрипта в планировщик задач вашей операционной системы. Периодичность и время запуска следует выбрать исходя из загруженности сайта и мощности сервера — чем мощнее сервер и чем больше пропускная способность интернет-канала, к которой он подключен, тем чаще можно запускать скрипт. Например, на моем партнерском сайте ozon2.ru данные обновляются раз в сутки.

Рассмотрим отдельно установку планировщика в системе Windows (для удаленного вызова bin/autoloader.php через браузер) и на Unix-сервере (для непосредственного запуска скрипта).

Шаг 2. Добавить скрипт в планировщик задач в Windows

Для начала надо создать ярлык, ссылающийся на скрипт на вашем сайте: http://адрес-вашего-сайта.com/путь-к-парсеру/bin/autoloader.php?path=business_catalog%2F12266

Автоматическое обновление: Создание ярлыка для скрипта автоагрузки

Затем добавим задание для периодического выполнения, для чего откроем «Панель управления» Windows, выберем «Назначенные задания» и создадим новое задание:

Автоматическое обновление: создание нового задания (Windows)

В открывшемся окне нажмите «Далее», а затем кнопку «Обзор» и выберите в качестве приложения, для которого следует составить расписание, ярлык, который мы сделали:

Автоматическое обновление: создание нового задания — выбор приложения (Windows)

Осталось только назначить периодичность запуска и подтвердить создание задания:

Автоматическое обновление: периодичность запуска задания (Windows)

Таким образом, наш скрипт будет запускаться ежедневно в 6 утра.

Шаг 3. Добавить скрипт в планировщик задач в Unix

Самый распространенный способ задать расписание запуска программы под Unix — использовать утилиту crontab, однако на вашем веб-сервере могут использоваться другие утилиты, поэтому лучше всего уточнить этот вопрос у хостинг-провайдера или в документации. Далее будет рассмотрен процесс задания расписания для запуска с помощью crontab.

Утилита crontab использует текстовый файл для задания расписания.

Для начала проверим, есть ли еще какие-либо расписания в системе — выполним следующую команду:

crontab -l

Если в системе уже существуют какие-то задачи, работающие по расписанию, вы увидите нечто подобное (конкретные значения расписания — числа и звездочки слева, а также пути к скриптам будут отличаться):

10 7 * * * php /home/site.com/fast/tagclean.php
10 7 * * * php /home/site.com/fast/cacheclean.php
15 7 * * * php /home/site.com/fast/sm.php

Создайте текстовый файл, в который добавьте следующую запись:

@daily php /полный_путь_к_вашему_сайту_на_сервере/ozonru-parser/bin/autoload.php business_catalog/12266

Префикс @daily укажет на то, как часто нужно запускать скрипт. Подробнее про параметры времени и периодичности запуска можно прочитать в руководстве к crontab или по адресу www.opennet.ru/man.shtml?topic=crontab&category=5&russian=0.

Если в вашей системе уже были назначенные задания, скопируйте в свой файл строчки с расписанием, которые вывел crontab -l. Сохраните файл с именем crontab.txt.

Осталось только обновить расписание в системе с помощью команды:

crontab /полный_путь_к_файлу/crontab.txt

Для надежности можно проверить, добавился ли запуск скрипта автозагрузки в расписание. Для этого нужно повторно выполнить команду crontab -l. Ваш скрипт должен быть указан в списке.

7. Импорт в базу данных

Один из вариантов работы и хранения данных из XML-каталогов OZON.ru — база данных. Это может потребоваться, если необходимо реализовать продвинутые алгоритмы работы с данными (фасетный поиск, сложное связывание и т.п.), для ускорения поиска или по другим причинам.

Для импорта данных из XML-каталогов в локальную базу данных можно использовать скрипт bin/dbimport.php, который, аналогично bin/autoloader.php, принимает в качестве параметра путь к XML-каталогу OZON.ru, и затем, если записи в базе устарели, выполняет импорт новых данных.

В качестве примера рассмотрим импорт данных по GPS-навигаторам в базу данных MySQL.

Шаг 1. Настроить параметры подключения к базе данных

Для подключения к базе данных необходимо знать четыре параметра:

Чтобы настроить эти параметры, нужно отредактировать файл bin/dbimport.php и задать в нем эти значения:

define('SERVER', 'localhost');      // сервер базы данных
define('USER', 'ozonuser');         // имя пользователя
define('PASSWORD', 'ozonpassword'); // пароль 
define('DB', 'ozondb');             // имя базы данных

Шаг 2. Настроить имена таблиц

Далее необходимо настроить имена таблиц, используемых в вашей базе данных, для хранения информации о товарах, категориях и связях между товарами и категориями:

Значения этих параметров нужно так же отредактировать в файле bin/dbimport.php:

define('OFFER_TABLE_NAME', 'ozon_offer');                   // таблица для хранения товаров
define('CATEGORY_TABLE_NAME', 'ozon_category');             // таблица для хранения категорий
define('OFFER_CATEGORY_TABLE_NAME', 'ozon_offer_category'); // таблица для хранения связей 

Шаг 3. Создать таблицы для товаров, категорий и связях между ними

Таблицы, в которых хранятся данные о товарах, категориях и связях между ними, могут иметь разную структуру в зависимости от нужд вашего сайта.

Для создания таблиц с информацией о GPS-навигаторах запустим следующий SQL-код:

-- Таблица для хранения информации о товарах
create table ozon_offer (
  offer_id int not null primary key,
  offer_price float not null,
  offer_picture varchar(255),
  offer_title varchar(255),
  offer_vendor varchar(255),
  offer_description text
);

-- Таблица для хранения информации о категории
create table ozon_category (
  category_id int not null primary key,
  category_parent_id int,
  category_name varchar(255)
);

-- Таблица для хранения информации о принадлежности товара к категориям
create table ozon_offer_category (
  offer_id int not null,
  category_id int not null
);

Шаг 4. Настроить формат данных в XSL-скрипте

Скрипт bin/dbimport.php работает с данными о товарах в простом текстовом виде, где поля данных разделены табуляцией (\t, 0x9), а данные о разных товарах разделены переводом строки (\n, 0x13):

data\tdata...\n
data\tdata...\n
...

Для преобразования XML-каталога в простой текстовый формат bin/dbimport.php использует XSL-файл src/xsl/db.xsl — в нем как раз и производится настройка формата данных для базы данных. Откройте его в редакторе и найдите следующий фрагмент, в котором задается формат данных для таблицы с информацией о товарах ozon_offer. Обратите внмание, как поля разделяются табуляцией и как вся запись заканчивается переводом строки.

<xsl:template match="offer">
    <!-- ID товара -->
    <xsl:value-of select="@id"/>
    <xsl:text>&#09;</xsl:text> <!-- табуляция \t -->
    <!-- Цена товара -->
    <xsl:value-of select="price"/>
    <xsl:text>&#09;</xsl:text>
    <!-- Картинка -->
    <xsl:value-of select="picture"/>
    <xsl:text>&#09;</xsl:text>
    <!-- Название -->
    <xsl:value-of select="title | name"/>
    <xsl:text>&#09;</xsl:text>
    <!-- Автор, производитель или режисер -->
    <xsl:value-of select="author | vendor | director"/>
    <xsl:text>&#09;</xsl:text>
    <!-- Описание товара -->
    <xsl:value-of select="description"/>
    <xsl:text>&#13;</xsl:text> <!-- перевод строки \n -->
</xsl:template>

Т.к. мы предполагаем использовать bin/dbimport.php для импорта только GPS-навигаторов (набор полей которых нам хорошо известен), отредактируем src/xsl/db.xsl следующим образом, удалив лишние команды:

<xsl:template match="offer">
    <!-- ID товара -->
    <xsl:value-of select="@id"/>
    <xsl:text>&#09;</xsl:text> <!-- табуляция \t -->
    <!-- Цена товара -->
    <xsl:value-of select="price"/>
    <xsl:text>&#09;</xsl:text>
    <!-- Картинка -->
    <xsl:value-of select="picture"/>
    <xsl:text>&#09;</xsl:text>
    <!-- Название -->
    <xsl:value-of select="name"/>
    <xsl:text>&#09;</xsl:text>
    <!-- Производитель -->
    <xsl:value-of select="vendor"/>
    <xsl:text>&#09;</xsl:text>
    <!-- Описание товара -->
    <xsl:value-of select="description"/>
    <xsl:text>&#13;</xsl:text> <!-- перевод строки \n -->
</xsl:template>

Обратите внимание на порядок полей в XSL-файле. Они должны идти в той же последовательности, что и поля в базе данных. В нашем случае: ID товара, цена, картинка, название, производитель, описание.

Формат катеогрий и связей между товарами и категориями в src/xsl/db.xsl соответствует нашм таблицам, поэтому мы оставим его без изменений:

<xsl:template match="category">
    <xsl:value-of select="@id"/>
    <xsl:text>&#09;</xsl:text>
    <xsl:value-of select="@parentId"/>
    <xsl:text>&#09;</xsl:text>
    <xsl:value-of select="."/>
    <xsl:text>&#13;</xsl:text>
</xsl:template>

<xsl:template match="categoryId">
    <xsl:value-of select="parent::offer/@id"/>
    <xsl:text>&#09;</xsl:text>
    <xsl:value-of select="."/>
    <xsl:text>&#13;</xsl:text>
</xsl:template>

Шаг 5. Запустить скрипт

Для импорта информации из XML-каталога по GPS-навигаторам нам осталось запустить скипт bin/dbimport.php. Сделать это можно двумя способами: из командной строки, или обратившись к скрипту через браузер — передав в качестве параметра путь к XML-каталогу для импорта.

Запуск скрипта из командной строки производится следующим образом:

php dbimport.php gps

Параметр gps, который мы передали, соответствует XML-каталогу для GPS-навигаторов.

Для запуска через браузер наберите в адресной строке следующее:

http://адрес-вашего-сайта.com/путь-к-парсеру/bin/dbimport.php?path=gps

В этом случае путь передается с помощью GET-параметра path.

В результате данные из XML-каталога попадут в базу.

Примечание

В скрипте bin/dbimport.php реализован импорт данных для сервера баз данных MySQL, как наиболее распространенного.

8. Удаление временных файлов

Парсер кэширует множество данных. По мере их обновления, старые данные перезаписываются, однако, иногда возникает необходимость удалить временные файлы, т.к. за долгое время работы сайта объем кэша может серьезно вырасти.

Для удаления временных файлов удобнее всего использовать скрипт bin/cacheclean.php. После его работы в каталоге cache/ могут остаться пустые папки. Они пригодятся для новых закэшированных данных.

FAQ и поддержка

Вопросы о партнерской программе OZON.ru можно задать на форуме на Searchengines.ru.

Любые предложения, вопросы и комментарии по поводу парсера присылайте по адресу davidovsv@yandex.ru.

Q0: Что появилось в новой версии парсера?

1.30 — исправлена ошибка в постраничном выводе.

1.29 — добавлен параметр для настройки названия параметра страницы. Исправлена ошибка с количеством товаров на странице.

1.28 — удалены некоторые каталоги, на которые у OZON.ru нет XML-файлов.

1.27 — новые пути к каталогам OZON.ru http://static.ozone.ru/multimedia/yml/facet/....

1.26 — исправлена ошибка с кэшированием времени изменения каталогов (парсер опрашивал OZON.ru при каждом запросе на дату изменения каталога).

1.25 — поддержка совместного использования кэша одновременно несколькими процессами с использованием парсера. Стало возможным указывать один и тот же каталог для кэш-файлов разным сайтам, работающим на одном сервере.

1.24 — исправлена работа с каталогами после изменений на сайте OZON.ru. Третьего уровеня, похоже больше вообще не будет в виде каталогов.

1.23 — исправлена работа с каталогами после изменений на сайте OZON.ru. Третий уровень временно отключен, т.к. он не поддерживается со стороны OZON.ru.

1.22 — исправлена критическая ошибка в browser.php.

1.21 — добавлен скрипт для удаления временных файлов; исправлена ошибка в кэшировании данных.

1.20 — исправлена ошибка с комплектом установки версии 1.19.

1.19 — улучшена работа кэша; исправлена ошибка с кодировкой в примере; добавлены исключения для некоторых каталогов, у которых нет XML-версии.

1.18 — исправлена ошибка в документации из-за которой не показывались картинки.

1.17 — исключения по каталогам, для которых нет XML-файлов, вынесены в отдельный файл /exceptions.txt.

1.16 — парсер исправлен после появления нового каталона на Озоне.

1.15 — парсер исправлен в соответствии с новой версткой сайта Озона.

1.14 — исправлен скрипт импорта в базу.

1.12 — незначительные исправления в документации.

1.11 — исправлена ошибка в dbimport.php и неверная ссылка на товар.

1.10 — исправлена ошибка в документации и кэшировании данных для получения списка категорий.

1.9 — исправлены ошибки кэширования страниц; ускорены загрузка и преобразование XML-каталогов.

1.8 — первая официальная версия.

Q1: Я не знаком с парсингом XML, с чего мне начать?

Для начала вам нужен настроенный веб-сервер с PHP 5 и библиотеками для XML и XSL. Предположим, что он у вас уже есть. Вам нужно скачать и распаковать дистрибутив парсера — на выходе вы получите папку ozonru-parser-XX/, в которой вы найдете несколько поддиректорий. Это все, что вам нужно для XML-парсинга каталогов OZON.ru.

Код, выполняющий парсинг и преобразование XML-каталогов, инкапсулирован в классы, содержащиеся в папке src/. Для того, чтобы товары из XML-каталога можно было представить на вашем сайте, можно использовать разные пути. В данном парсере для представления данных о товарах из XML-каталога используется XSL. Фактически, он служит для того, чтобы описать, как будут выглядеть (в HTML- или текстовом формате) те или иные составляющие товара из XML-каталога. Возьмем в качестве примера описание товара из XML-каталога GPS-навигаторов:

<offer id="2929274" available="true">
    <url>http://www.ozon.ru/context/detail/id/2929274/?from=partner</url>
    <price>3200</price>
    <currencyId>RUR</currencyId>
    <categoryId>1095017</categoryId>
    <picture>http://www.ozon.ru/multimedia/spare_covers/1000414605.jpg</picture>
    <delivery>true</delivery>
    <orderingTime>
        <ordering>На складе</ordering>
    </orderingTime>
    <name>JJ-Connect Fisherman 160</name>
    <vendor>JJ-Connect</vendor>
    <description>Новый эхолот JJ-Connect Fisherman 160 отличается увеличенной по сравнению 
        с Fisherman 150 глубиной эхолокации (до 60 м). Подобная величина достигается 
        благодаря повышенной мощности эхолота, которую обеспечивают 4 элемента питания АА, 
        расположенные в отдельном батарейном отсеке. Эхолот соответствует стандарту 
        водозащищенности IPX7, что определяет его беспроблемное использование на воде. 
        Прибор оборудован функцией увеличения изображения на дисплее (Zoom), а также 
        возможностью выбора одного из 5 уровней чувствительности. Отличается компактными 
        размерами, эффективностью и исключительной экономичностью. Отлично зарекомендовал 
        себя при подледном лове.
    </description>
</offer>

Как вы видите, в описании представлена различная информация, и, скорее всего, не вся она должна быть представлена на вашем сайте. Для фильтрации и форматирования этой информации используется XSL. В составе парсера есть XSL-файл src/xsl/core.xsl, в котором закодированы фильтры для различных полей описания товара. Вы можете использовать его, либо написать свои собственные фильтры. Например, так выглядит фильтр для картинки товара:

<xsl:template match="offer/picture">
    <img src="{node()}" alt="{parent::node()/name | parent::node()/title}"/>
</xsl:template>

Чтобы просто вывести данные о товрах из какой-либо ветки каталогов OZON.ru всего этого можно не знать, достаточно использовать базовые скрипты парсера. Делается это так:

require_once dirname(__FILE__).'/../src/OzonCatalog.php';

$catalog = new OzonCatalog('gps');
$catalog->transofrm(dirname(__FILE__).'/../web/catalog.xsl');

В дальнейшем, если вам понадобится изменить формат представления товара, вы можете написать собственный XSL-обработчик.

Так же вы можете заглянуть в пример 1, где указанные выше шаги описаны подробно.

Q2: Как изменить количество товаров на странице?

Если вы используете XSL на базе src/xsl/core.xsl (например, web/catalog.xsl), количество товаров на странице можно задать с помощью параметра PAGESIZE прямо в файле src/xsl/core.xsl, либо передав параметр в XSL из PHP:

$catalog->transofrm(dirname(__FILE__).'/../web/catalog.xsl', array('PAGESIZE'=>50));

Q3: Как задать партнерский идентификатор?

Партнерский идентификатор можно задать как непосредственно в файле src/xsl/core.xsl, так и передав его в качестве параметра при XSL-трансформации:

$catalog->transofrm(dirname(__FILE__).'/../web/catalog.xsl', array('PARTNER'=>'myid'));

При использовании скриптов из папки web/ партнерский идентификатор можно задать в конфигурационном файле web/config.php.

Q4: Мне нужно передать дополнительные GET-параметры при постраничном выводе, как это сделать?

Специально для этого предусмотрена переменная URL_PARAMS, которая используется в src/xsl/core.xsl. Значение этой переменной будет один в один подставлено в параметры ссылки при постраничном выводе. Например, в web/catalog.php эта переменная используется для передачи пути к XML-каталогу:

$transformer->transform($catalog,
  array('PAGENUM'=>$page, 'PARTNER'=>$PARTNER_ID, 'URL_PARAMS'=>'path='.urlencode($path)));

Q5: Как мне изменить внешний вид описания товара на моем сайте?

Если для представления товаров из XML-каталога вы используете базовый XSL, поставляемый с парсером, для изменения внешнего вида описания товара на вашем сайте нужно изменить CSS-файл web/main.css.

Подробнее об изменении внешнего вида описания товара рассказано в примере 3.

Q6: Какая информация о товаре содержится в XML-каталоге?

Информация о товарах, представленная в XML-каталоге OZON.ru, зависит от типа товара (например, у книг есть элемент <author>, а у фильмов — <director>). Для описания полей с информацией о товаре будем использовать XPath-нотацию (@id — атрибут с именем "id" — <offer id="...">; url — имя вложенного элемента с именем "url" — <offer><url/></offer>).

Общие поля:

Поля, специфичные для книг:

Поля, специфичные для аудиокниг (в дополнение к полям для книг):

Поля, специфичные для фильмов и видео:

Поля, специфичные для музыкальных записей:

Поля, специфичные для музкального видео (в дополнение к полям для музыкальных записей):

Поля, специфичные для товаров электроники, оптики, мобильных телефонов, часов, бытовых приборов, косметики, игрушек, посуды:

Поля, специфичные для старинных гравюр:

Поля, специфичные для прочих товаров:

Q7: Парсер выводит ошибку «Fatal error: Uncaught exception...», что делать?

Как правило, такая ошибка появляется, если неправильно указать путь к XML-каталогу OZON.ru. Например, вы хотите вывести список книг из каталога «Компьютерная литература» (ID каталога третьего уровня — 12256), который находится в каталоге второго уровня «Нехудожественная литература», но при этом указываете путь business_catalog/12256 (как если бы он находился в каталоге второго уровня «Бизнес-книги»).

В этом случае ошибка будет выглядеть примерно так:

Fatal error: Uncaught exception 'BrowserException' with message 
  'Cannot TEST http://www.ozon.ru/multimedia/yml/partner/business_catalog/12256.xml' 
in /.../ozon-parser/src/OzonCatalog.php:104 Stack trace: #0 
/.../ozon-parser/src/XSLTransformer.php(38): OzonCatalog->getInfo() #1 
/.../ozon-parser/src/OzonCatalog.php(165): 
XSLTransformer->transform(Object(OzonCatalog), Array) #2 
XSLTransformer->/.../ozon-parser.htm(141): 
XSLTransformer->OzonCatalog->transform('ozon-parser/src...', Array) #3 
XSLTransformer->{main} thrown in /.../ozon-parser/src/OzonCatalog.php on line 104

Правильный вариант: nonfiction_catalog/12256 — этот путь и надо указать классам парсера при обращении к выбранному XML-каталогу.

Лицензия

* Парсер — это программа для ЭВМ «Партнерский инструмент для показа товарных каталогов».

Авторские права на программу для ЭВМ «Партнерский инструмент для показа товарных каталогов» принадлежат Давыдову Станиславу Валерьевичу. ООО «Интернет Решения» (ОГРН 1027739244741) является обладателем исключительной лицензии на использование указанной программы на основании Лицензионного договора № ИР-Р 73/09 от 18.12.2009 г. Незаконное воспроизведение или распространение данной программы или любой ее части влечет предусмотренную законом ответственность.