К содержимому

Документация

PHP SDK: Яндекс Маркет: товары и поиск

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

products

products(): array возвращает выбранные карточки в виде ключей card:103324529910. В форме используйте обычные ссылки или артикулы; ключи подготовит платформа. Ссылки прежнего вида /product--название/номер имеют ключ product:номер.

regions

regions(): array возвращает коды выбранных городов строками. Один и тот же товар в разных городах сохраняется отдельными записями.

query

query(): string возвращает поисковый запрос сценария. Выдача может содержать похожие товары, а не только точные совпадения названия.

maxPages

maxPages(): int возвращает глубину обхода от 1 до 30 страниц за запуск. Число карточек на странице задаёт Маркет, оно может меняться.

card

card(string $product, string $regionId): array получает выбранную карточку. В ответе есть ym_id, ym_kind, ym_sku, ym_region_id, ym_region_name, title, brand, supplier, url, main_image, gallery, product_description, доступные characteristics, rating и feedbacks.

Цены имеют разные условия:

  • price_rub: показанная цена без карты Яндекс Пэй, если её удалось подтвердить.
  • pay_price_rub: цена по карте Яндекс Пэй, если она указана.
  • display_price_rub: цена из структурированного описания витрины. Она может требовать специальных условий оплаты; не подменяйте ею обычную цену.
  • base_price_rub и discount_percent: цена до скидки и скидка относительно цены без карты Яндекс Пэй.

Недоступное поле равно null, а не нулю. available может быть true, false или null. Точные остатки на складах не заявляются. Ошибка страницы, ограничение доступа или отсутствие подтверждённой карточки вызывают ошибку. Это не означает, что товара нет в продаже. Тексты и авторы отзывов в результат не включаются.

$source = $ctx->yandexMarket();
foreach ($source->regions() as $region) {
    foreach ($source->products() as $product) {
        $card = $source->card($product, $region);
        $ctx->emit($source->record($card), $card['ym_kind'].':'.$card['ym_id'].':'.$region);
    }
}

search

search(string $regionId, int $page): array возвращает cards, page, total и has_next. total может быть null. Продолжайте обход по has_next, а не по числу карточек. Поиск разрешён только для настроенных сценариев ассортимента, позиций и предложений по цене. Последний использует сортировку Маркета по возрастанию цены; рекламные вставки и разные условия оплаты могут влиять на порядок.

У результата есть source_query, search_page, position_on_page и, если источник сообщил, sponsored. Место на странице не является постоянной позицией во всех вариантах выдачи. При повторениях товара сохраняется первое его появление в пределах города и запуска.

$source = $ctx->yandexMarket();
foreach ($source->regions() as $region) {
    for ($page = 1; $page <= $source->maxPages(); $page++) {
        $result = $source->search($region, $page);
        foreach ($result['cards'] as $card) {
            $ctx->emit($source->record($card), $card['ym_kind'].':'.$card['ym_id'].':'.$region);
        }
        if (! $result['has_next']) {
            break;
        }
    }
}

record

record(array $card): array оставляет поля текущего готового сценария: например, цены и наличие для мониторинга цен или рейтинг и число оценок для рейтингов. Общие идентификаторы, город, название, ссылка и изображения сохраняются всегда.

Запросы проходят стандартные сетевые проверки, ограничения частоты и правила сайта. Изменение разметки или ограничение доступа могут остановить сбор. Полнота всего каталога и постоянная доступность источника не гарантируются.