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 оставляет поля текущего готового сценария: например, цены и наличие для мониторинга цен или рейтинг и число оценок для рейтингов. Общие идентификаторы, город, название, ссылка и изображения сохраняются всегда.
Запросы проходят стандартные сетевые проверки, ограничения частоты и правила сайта. Изменение разметки или ограничение доступа могут остановить сбор. Полнота всего каталога и постоянная доступность источника не гарантируются.