У каталога есть разделы, подразделы, списки товаров и карточки. И есть ещё один вид страниц, которого в каталоге нет, хотя выглядит он точно как список товаров: подборки. Страницы меток и тегов, подбор по цвету или объёму, сортировки, «новинки» и «хиты», результаты поиска. Разница не в разметке — разметка у них та же самая витрина, — а в смысле. Товар на странице метки лежит не здесь: он лежит в своём разделе, а сюда попал подборкой, и в двадцать других подборок вместе с ним. Собрать такую страницу значит выписать один и тот же товар столько раз, во скольких подборках он состоит, — и ни разу не назвать раздел, в котором он на самом деле есть.

Почему адрес этого не различает

Формы адресов у метки и у товара совпадают буквально:
Три куска пути после /catalog и там, и там. Любое выражение, описывающее одно, описывает и другое: [^/]+ совпадает с tag ровно так же, как с kraska. Списком запрещённых слов это тоже не решается — следующий магазин назовёт свои подборки podbor, f или collection.

Как это решается

Первый рубеж — карта сайта: фасетов в ней не бывает, и большинство их отсекается ещё до первого захода. Второй и главный — обход читает каждую собранную страницу целиком: всю исходную разметку, со всеми div, классами и атрибутами, как её отдал браузер. По ней и решает, чем страница оказалась. Под not_catalog попадают подборки — и попадают даже когда на них настоящие товары с настоящими ценами; это и есть главный признак, ради которого страница читается целиком, а не угадывается по адресу. Туда же идут служебные страницы: корзина, вход, доставка, новости, статьи.
У каждой такой страницы записано, почему она признана не каталогом. В выгрузке этих строк нет вовсе, а в сводке задания видно, сколько их было отброшено: "не_каталог": 120.

Что происходит с отброшенной страницей

  1. Поля с неё не разбираются — разбирать нечего.
  2. По её ссылкам обход не идёт: ссылки подборки ведут в другие подборки.
  3. Её кредиты не списываются и в оплаченный объём она не входит: вы покупали страницы каталога, а не наши неудачные заходы.
  4. Её форма адреса запоминается — и остальные ссылки той же формы уже не берутся ни на этом задании, ни на следующих по тому же сайту.
Последнее важнее прочего. Подборок на среднем каталоге больше, чем товаров: собрать каждую, чтобы каждую выбросить, стоило бы дороже самого каталога. Форма при этом не вычёркивается с одного раза — нужно два независимых свидетельства. Настоящий блок фильтров набирает их мгновенно: в нём два десятка ссылок одной формы, и они называются разом, ещё до того, как хоть одна из них собрана. А одиночная ошибка так и остаётся одиночной. Две вычеркнутые формы, различающиеся одним куском пути, дают третью — общую:
Форма, встреченная как настоящий раздел или товар, не вычёркивается никогда, а уже вычеркнутая — снимается, если такая страница всё-таки нашлась. Иначе одна ошибка на брендовой странице (/catalog/tikkurila/ — это и подборка, и полноценный раздел, смотря по магазину) остановила бы обход этого сайта навсегда.

Названия разделов

Имя раздела и подраздела берётся со страницы: заголовок <h1> или последний элемент хлебных крошек — то, что на ней написано. Ни кусок адреса, ни <title> именем раздела не становятся. <title> на многих сайтах один на всю ветку каталога и выглядит как «Купить Tikkurila с доставкой по Минску и Беларуси» — такой заголовок называет не раздел, а магазин. Кусок адреса даёт «aerozoli stroitelnye», чего не говорил никто.
Если имени на странице не нашлось, клетка остаётся пустой. Пустая клетка говорит «мы не нашли имени» — и это честнее, чем латинская транслитерация из адреса, выданная за название раздела.

Обычный обход по своему правилу

Всё сказанное относится к готовым решениям, где каталог разбираем мы. У /v1/crawl с правилом, написанным вами, формы адресов ваши собственные, и страницы помечаются по ним — так же, как раньше.