Каталог и ссылки
Товары находятся в исходном HTML. Страницы переключаются ссылками с параметром page.
/marketДемонстрационный сайт для обучения «Акмело». Во всех вариантах используются одни и те же 10 000 вымышленных товаров. Изменяется способ их загрузки и перехода между страницами.
Товары находятся в исходном HTML. Страницы переключаются ссылками с параметром page.
/marketТе же товары, но номер страницы находится в пути: /market/page/2.
/market/page/2Сервер отдаёт пустую сетку. Браузер получает товары отдельным запросом к API.
/market/jsНовые товары добавляются после клика. Адрес страницы не меняется.
/market/moreКнопки заменяют список на следующую или предыдущую страницу, не меняя адрес.
/market/nextСледующая порция появляется при прокрутке. Кнопка загрузки доступна и с клавиатуры.
/market/infiniteВ карточке нет прямой ссылки. «Подробнее» открывает окно, в ответе на отдельный запрос появляется переход к товару.
/market/revealСпециальная витрина с отсутствующей ценой, повтором артикула, отрицательным остатком и пустым названием.
/market/qualityПять фотографий, переключение ракурсов и вариантов, характеристики и подробности ухода.
/market/1В обычном каталоге данные корректны. На странице проверки качества четыре контрольные карточки видны сразу; ссылки ниже открывают те же ошибочные данные отдельно.
Учебный период — август 2026 года: у товара 1 есть 31 наблюдение, у товара 2 — два, у товара 3 наблюдений нет. Валюта в шапке меняет отображение по фиксированному учебному курсу; исходное поле price в API остаётся в рублях.
Сценарий изменения данных повышает цену на 290 ₽ и уменьшает остаток на 8 у каждого седьмого товара. Сброс возвращает исходные значения.
В магазине нет авторизации, оплаты и оформления заказов. Избранное существует только до обновления страницы. Фотографии показывают 16 видов товаров; у каждого вида 625 моделей с общей галереей из обложки и четырёх интерьерных ракурсов. Авторы и тексты отзывов вымышлены.
Практика на своём темпе
Выберите задачу, соберите данные и сравните результат с самопроверкой. Начните с небольшой выборки. Все товары, авторы отзывов, цены и курсы здесь учебные. Кнопка откроет Акмело; упражнение не запускается автоматически.
Задание 01
Получить шесть основных полей без запуска браузера.
Страница сбора: /market
Поля: product_id sku name price stock url
Ожидаемый результат: 24 записи первой страницы, уникальные product_id от 1 до 24.
Самопроверка: Сверить ID 1: LD-00001,4660 RUB, остаток 17. Цена — число, ссылка — полный URL.
Задание 02
Научиться следовать пагинации в query-параметре.
Страница сбора: /market?page=1
Поля: product_id sku name price stock url
Ожидаемый результат: 72 разных товара, по 24 с каждой страницы.
Самопроверка: ID не повторяются; min=1, max=72. Ограничение пробы не выдаётся за конец каталога.
Задание 03
Пройти обычные ссылки с номером внутри маршрута.
Страница сбора: /market/page/1
Поля: product_id sku url
Ожидаемый результат: 72 уникальных ID и настоящие полные ссылки товаров.
Самопроверка: Адрес каждой страницы содержит /market/page/N; записи не потеряны и не продублированы.
Задание 04
Собрать все товары, контролируя полноту.
Страница сбора: /market
Поля: product_id sku name price stock url
Ожидаемый результат: 10 000 уникальных ID;417 страниц по 24, последняя — 16.
Самопроверка: Множество ID равно 1…10000. Выборка 1/7/10000 совпадает с источником; нет пропусков и повторов.
Задание 05
Собрать только освещение по возрастанию цены.
Страница сбора: /market?category=lighting&sort=price-asc
Поля: product_id category price url
Ожидаемый результат: 1250 товаров категории lighting в выбранном порядке.
Самопроверка: Все category равны lighting; цена не убывает между соседними строками, включая границы страниц.
Задание 06
Проверить поиск без случайного широкого охвата.
Страница сбора: /market?q=LD-00001
Поля: product_id sku name price url
Ожидаемый результат: Одна базовая запись ID 1, SKU LD-00001.
Самопроверка: Не собраны соседние карточки или исполнение Графит вместо default; найдено ровно одно совпадение.
Задание 07
Собрать доступные товары и проверить фильтр.
Страница сбора: /market?inStock=1
Поля: product_id sku stock price url
Ожидаемый результат: Каждая сохранённая запись имеет stock>0; количество равно total этой выборки.
Самопроверка: Нулевых и отрицательных остатков нет. Не использовать общее 10000 как количество отфильтрованных товаров.
Задание 08
Отличить пустой серверный HTML от готовой страницы.
Страница сбора: /market/js
Поля: product_id sku name price stock url
Ожидаемый результат: 24 товара после реальной загрузки; в исходной сетке HTML карточек нет.
Самопроверка: Первый ID 1, последний 24. Тайм-аут загрузки не считается успешным пустым результатом.
Задание 09
Пройти три заменяющиеся порции по кнопке.
Страница сбора: /market/next
Поля: product_id sku price stock url
Ожидаемый результат: 72 уникальных товара; URL не изменился, сетка содержит текущую порцию.
Самопроверка: После каждой загрузки новые 24 ID; первые данные не потеряны при замене DOM.
Задание 10
Обрабатывать добавленные карточки один раз.
Страница сбора: /market/more
Поля: product_id sku price url
Ожидаемый результат: В DOM72 карточки и в результате 72 уникальных товара.
Самопроверка: Не получить 24+48+72=144 записи повторным чтением всех узлов. URL остаётся прежним.
Задание 11
Проверять подгрузку по появлению новых данных.
Страница сбора: /market/infinite
Поля: product_id sku price url
Ожидаемый результат: 72 уникальных товара после двух подгрузок.
Самопроверка: Учебное ограничение трёх порций отличается от настоящего конца списка; задержка сети не маскируется успехом.
Задание 12
Получить URL через Подробнее, а не угадать его.
Страница сбора: /market/reveal
Поля: product_id sku url
Ожидаемый результат: Восемь соответствий ID→URL, полученных реальным раскрытием.
Самопроверка: До клика в карточке нет прямого href. ID диалога совпадает с карточкой; старый URL не переиспользован.
Задание 13
Извлечь упорядоченные галереи трёх моделей.
Страница сбора: /market/1
Поля: product_id main_image gallery
Ожидаемый результат: Три записи по пять фото:15 вхождений и 10 уникальных исходных изображений.
Самопроверка: image.url совпал с gallery[0].url. ID 1 и 17 делят галерею семейства; фото авторов отзывов не попали в неё.
Задание 14
Сохранить варианты без перезаписи друг друга.
Страница сбора: /market/1
Поля: product_id variant sku model color price gallery
Ожидаемый результат: Две записи одного ID: LD-00001/4660 RUB и LD-00001-GR/5050 RUB.
Самопроверка: URL и ID прежние, но SKU, модель, цвет, пять фото и документы относятся к своему исполнению.
Задание 15
Получить параметры, которых нет в исходном коротком блоке.
Страница сбора: /market/1
Поля: product_id variant country country_code specifications
Ожидаемый результат: Полный список specs совпадает с ответом API; страна и код сохранены отдельно.
Самопроверка: Дополнительный контейнер до fetch пуст. Числа и boolean не превращены в строки; старый ответ другого variant не смешан с новым.
Задание 16
Получить авторов, оценки и тексты без смешения с товарными фото.
Страница сбора: /market/1
Поля: product_id review_id author_id author_name author_age avatar_url rating date title text
Ожидаемый результат: 4 отзыва из HTML плюс 6 после клика: всего 10 отзывов и 10 вымышленных авторов. API без параметров возвращает все 10 сразу.
Самопроверка: До клика в DOM 4 отзыва, после — 10 уникальных review_id; оценки 1…5, сводка учитывает все 10. Повторный клик не создаёт дубли. Фото author.avatar не входят в gallery; все авторы и отзывы учебные.
Задание 17
Корректно обрабатывать плотную, редкую и отсутствующую историю.
Страница сбора: /market/1
Поля: product_id variant date price currency
Ожидаемый результат: ID 1 — 31 ежедневная точка; ID 2 — 2 точки; ID 3 — 0 точек.
Самопроверка: Даты только 01…31 августа 2026 по порядку. Пустая история не превращается в точку с нулевой ценой.
Задание 18
Сохранять цену вместе с её валютой.
Страница сбора: /market/1?currency=USD
Поля: product_id variant price_rub display_price currency
Ожидаемый результат: Для 4660 RUB:46,60 USD;42,36 EUR;332,86 CNY.
Самопроверка: Коэффициенты:1 USD=100 RUB,1 EUR=110 RUB,1 CNY=14 RUB. Это синтетические значения, не актуальный курс.
Задание 19
Сохранить дефекты и объяснить их, а не скрыть.
Страница сбора: /market/quality
Поля: product_id sku name price stock url
Ожидаемый результат: 96 записей, среди них 37:price=null;88: пустое name;71:stock=-3;53/54: одинаковый SKU.
Самопроверка: 53 и 54 остались разными строками. При required-полях получится 94 сохранённых/2 отклонённых — это другой ожидаемый результат готового quality-ready.
Задание 20
Скачать и проверить содержание документов товара.
Страница сбора: /market/1
Поля: product_id variant sku country document_format document_url
Ожидаемый результат: Шесть читаемых файлов: паспорт PDF, подробные параметры Excel, инструкция и уход Word для двух исполнений.
Самопроверка: Default содержит LD-00001/4660, Графит — LD-00001-GR/5050. Ссылка сама по себе не доказывает чтение файла; парсинг требует отдельного алгоритма.