# Что не каталог: фильтры, метки и подборки

> Почему форма адреса не отличает страницу-метку от подраздела, как обход читает страницу целиком и что попадает в пометку not_catalog

Источник: https://docs.parreq.com/crawl-not-catalog/

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

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

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

Формы адресов у метки и у товара совпадают буквально:

```
/catalog/tikkurila/tag/morilka/          ← подборка по метке
/catalog/kraska/emal-pf-115/belaya/      ← карточка товара
```

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

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

Первый рубеж — [карта сайта](https://docs.parreq.com/crawl-sitemap): фасетов в ней не бывает, и
большинство их отсекается ещё до первого захода.

Второй и главный — обход читает **каждую собранную страницу целиком**: всю
исходную разметку, со всеми `div`, классами и атрибутами, как её отдал браузер.
По ней и решает, чем страница оказалась.

| пометка | что это |
|---|---|
| `sections` | оглавление каталога — ссылки на разделы, товаров нет |
| `subsections` | то же, но внутри раздела |
| `listing` | список товаров раздела: цены и постраничная навигация |
| `card` | карточка одного товара |
| `not_catalog` | к каталогу не относится |

Под `not_catalog` попадают подборки — и попадают **даже когда на них настоящие
товары с настоящими ценами**; это и есть главный признак, ради которого
страница читается целиком, а не угадывается по адресу. Туда же идут служебные
страницы: корзина, вход, доставка, новости, статьи.

> **К сведению.**
>   У каждой такой страницы записано, **почему** она признана не каталогом. В
>   выгрузке этих строк нет вовсе, а в сводке задания видно, сколько их было
>   отброшено: `"не_каталог": 120`.

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

1. Поля с неё не разбираются — разбирать нечего.
2. По её ссылкам обход не идёт: ссылки подборки ведут в другие подборки.
3. Её кредиты не списываются и в оплаченный объём она не входит: вы покупали
   страницы каталога, а не наши неудачные заходы.
4. **Её форма адреса запоминается** — и остальные ссылки той же формы уже не
   берутся ни на этом задании, ни на следующих по тому же сайту.

Последнее важнее прочего. Подборок на среднем каталоге больше, чем товаров:
собрать каждую, чтобы каждую выбросить, стоило бы дороже самого каталога.

Форма при этом не вычёркивается с одного раза — нужно **два независимых
свидетельства**. Настоящий блок фильтров набирает их мгновенно: в нём два
десятка ссылок одной формы, и они называются разом, ещё до того, как хоть одна
из них собрана. А одиночная ошибка так и остаётся одиночной.

Две вычеркнутые формы, различающиеся одним куском пути, дают третью — общую:

```
/catalog/tikkurila/tag/<*>
/catalog/gidroizolyatsiya/tag/<*>
                  ↓
/catalog/<*>/tag/<*>          ← отсекает метки всех разделов сразу
```

> **Внимание.**
>   Форма, встреченная как настоящий раздел или товар, не вычёркивается никогда,
>   а уже вычеркнутая — снимается, если такая страница всё-таки нашлась. Иначе
>   одна ошибка на брендовой странице (`/catalog/tikkurila/` — это и подборка, и
>   полноценный раздел, смотря по магазину) остановила бы обход этого сайта
>   навсегда.

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

Имя раздела и подраздела берётся **со страницы**: заголовок `<h1>` или
последний элемент хлебных крошек — то, что на ней написано.

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

> **Внимание.**
>   Если имени на странице не нашлось, клетка остаётся пустой. Пустая клетка
>   говорит «мы не нашли имени» — и это честнее, чем латинская транслитерация из
>   адреса, выданная за название раздела.

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

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