Почему Яндекс не загружает картинки из YML-фида: проверяем <picture>, URL и сервер
YML-фид загружается, товары в кабинете есть, но изображения не появились — или загрузились только у части предложений. В такой ситуации весь файл обычно исправлять не нужно. Начать лучше с одного проблемного offer и ссылки на его картинку.
Путь короткий: YML → <picture> → URL изображения → HTTP-ответ сервера → требования площадки. Ошибка на любом из этих этапов выглядит одинаково: товар есть, а фотографии нет.
1. Сначала проверьте значение <picture>
Внутри предложения ссылка обычно выглядит так:
<offer id="123">
...
<picture>https://example.ru/images/product-123.jpg</picture>
</offer>
Проверьте сам элемент, не переходя пока к настройкам сервера:
- значение не пустое;
- указан полный адрес с
http://илиhttps://, а не путь вида/images/product-123.jpg; - в домене, каталоге и имени файла нет опечатки;
- по адресу возвращается изображение, а не HTML-страница товара, форма входа или заглушка;
- в URL нет пробелов и случайных кавычек.
Если у ссылки есть параметры, не забудьте про XML. Амперсанд внутри текста элемента записывается как &: например, image.jpg?size=large&color=black. Неэкранированный & способен сломать XML раньше, чем площадка доберётся до картинки.
2. Картинка открывается в браузере — этого недостаточно
Ваш браузер может отправлять cookie, проходить проверку CDN и обращаться с домашнего IP. Робот площадки приходит без вашей сессии и получает другой ответ. На практике проблема часто оказывается не в самом теге <picture>, а в том, что сервер не отдаёт файл внешнему клиенту.
Типичные причины: защита от ботов, WAF или CDN блокирует запрос; включена защита от хотлинков; файл доступен только после авторизации; временная подписанная ссылка уже истекла; сервер нестабилен; редирект ведёт на страницу входа или другой закрытый домен.
Для первой проверки достаточно двух команд:
curl -I -L "https://example.ru/images/product-123.jpg"
curl -L -o /dev/null -sS -w "%{http_code} %{content_type}\n" "https://example.ru/images/product-123.jpg"
Первая показывает заголовки и цепочку переходов, вторая выполняет обычный GET-запрос и выводит конечный статус с типом содержимого. Если результат плавает, проверьте журналы CDN и веб-сервера в момент запроса. Подробная схема сетевой диагностики есть в статье про ошибки 403, 404, 500 и редиректы.
3. Проверьте HTTP-ответ самой картинки
Нормальный ориентир — конечный ответ 200 OK и содержимое изображения. Статусы 301 и 302 сами по себе не означают ошибку: имеет значение, куда заканчивается переход и можно ли получить файл без cookie и авторизации.
403 Forbidden— сервер понял запрос, но отказал в доступе;404 Not Found— файла нет по указанному адресу;429 Too Many Requests— защита ограничивает частоту запросов;500–504— ошибка или недоступность сервера;200 OKсtext/html— часто страница-заглушка вместо картинки.
4. Сверьте формат и параметры изображения
У Директа и Маркета разные правила. Успешная загрузка изображения в один сервис не доказывает, что оно подходит другому.
Яндекс Директ
По актуальным требованиям к YML-фиду Директа, URL в <picture> должен начинаться с HTTP или HTTPS. Допустимы JPG, PNG, WebP и GIF; ширина и высота — не меньше 450 пикселей каждая; файл — не больше 10 МБ. Можно передать несколько элементов <picture>, а Яндекс рекомендует пять изображений товара.
Яндекс Маркет
Маркет тоже принимает несколько элементов <picture> внутри <offer>. Для товарных изображений разрешены JPG/JPEG, PNG, HEIC и WebP; минимальный размер — 300 × 300 пикселей; максимальный вес — 10 МБ. Эти значения приведены в отдельной справке Маркета об изображениях.
Не объединяйте списки форматов. GIF указан у Директа, но не в текущем списке Маркета; HEIC указан у Маркета, но не у Директа. Если один YML используется для обеих площадок, выбирайте формат, который поддерживают обе.
Есть ещё один практический нюанс: если вы заменили файл, сохранив прежний URL, площадка может продолжить показывать старую версию. В справке Яндекса для обновления изображения рекомендуется опубликовать его по новой ссылке и изменить <picture> в фиде.
5. Почему не загрузилась только часть картинок
Если из 1 000 товаров без фотографий остались 37, искать одну общую ошибку во всём YML обычно бессмысленно. Выгрузите ID этих предложений и сравните их с несколькими рабочими offer.
- Не лежат ли проблемные файлы на другом домене или CDN?
- Нет ли у них другого расширения, размера или веса?
- Содержат ли URL параметры, пробелы, кириллицу или короткоживущую подпись?
- Совпадают ли конечный HTTP-статус и
Content-Type? - Существует ли файл физически и доступен ли без браузерной сессии?
- Не объединяет ли проблема одну категорию, поставщика или генератор ссылок?
Так быстрее находится закономерность: например, все 37 ссылок ведут на старый поддомен, только WebP-файлы отдаются как application/octet-stream или один узел CDN отвечает 403. Если вместе с изображениями исчезают сами позиции, используйте отдельную диагностику пропавших товаров по offer ID.
В большом файле вручную искать пустые и относительные ссылки неудобно. ФидСторож скачивает публичный YML, проверяет XML и структуру предложений, находит пустой <picture> и ссылку без HTTP(S), затем показывает путь к проблемному элементу. Доступность каждой картинки, её размер и вес сервис сейчас не проверяет — эти пункты нужно пройти отдельно.
6. Быстрый чек-лист
- Найдите один проблемный
offerпо стабильному ID. - Проверьте, что
<picture>не пуст и содержит полный HTTP(S)-URL. - Убедитесь, что URL корректно записан в XML и ведёт к изображению.
- Проверьте конечный HTTP-статус, редиректы и
Content-Type. - Повторите запрос без cookie и авторизации; при необходимости посмотрите логи CDN/WAF.
- Сверьте формат, размеры и вес с требованиями нужной площадки.
- Сравните проблемное предложение с рабочим и найдите общее отличие.
- После исправления обновите фид и дождитесь его повторной обработки Яндексом.
Для YML-фида Директа полезен отдельный чек-лист структуры и обязательных полей. Он поможет не смешивать ошибку изображения с отклонением самого предложения.