# Цена обхода

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

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

Обход не заменяет цену страницы, а добавляется к ней. В прайсе он одна
позиция:

| позиция | кредитов | когда |
|---|---|---|
| `crawl` | 1 за страницу | надбавка сверх обычной цены страницы |

Страница обхода стоит столько же, сколько стоила бы в [Fetch](https://docs.parreq.com/pricing), плюс
кредит за то, что адрес нашли за вас.

## Арифметика

| что берём | из чего складывается | за страницу |
|---|---|---|
| разметка | `html` 1 + `crawl` 1 | **2** |
| разметка с разбором | `html` 1 + `crawl` 1 + `extract` 3 | **5** |
| разметка со скриншотом | `html` 1 + `crawl` 1 + `screenshot` 4 | **6** |
| разметка со скриптами и сетью | `html` 1 + `crawl` 1 + `js` 2 + `network` 2 | **6** |

Дальше — умножение на число вправду пройденных страниц:

| обход | за страницу | страниц | итого |
|---|---|---|---|
| каталог из 34 страниц, только разметка | 2 | 34 | **68** |
| тот же каталог с разбором в объекты | 5 | 34 | **170** |
| 200 карточек с разбором | 5 | 200 | **1000** |
| 50 страниц со скриншотом каждой | 6 | 50 | **300** |

> **Примечание.**
>   Кредит на обход — это цена не за поиск ссылок, а за то, что страница
>   берётся фоном: заданию нужно место в хранилище, своя очередь и повторный
>   запуск после перезапуска сервиса. Одна страница через Fetch и одна страница
>   внутри обхода — разная работа при одинаковом результате.

## Сколько проверяют до старта

В `crawl_metadata` приходят два числа, и путать их не стоит:

- **`credits_max`** (`integer`):
  Во сколько обойдётся обход, если пройдёт все заказанные `pages`. Это оценка
  сверху — `pages_planned` умноженное на цену страницы.

- **`credits`** (`integer`):
  Сколько списано на самом деле. Растёт по ходу задания и в конце оказывается
  не больше `credits_max`, а обычно меньше.

Проверка «хватит ли на весь обход» делается **до старта**, по `credits_max`.
Если денег на полный обход не хватает, задание не принимается вовсе —
`402 out_of_credits`, ничего не списано, ничего не запущено.

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

## Списывают по факту

Заказали 200 страниц, ссылки кончились на 47-й — заплатите за 47. Отменили на
двенадцатой — за двенадцать. `pages_planned` участвует только в проверке
баланса, в счёт идёт `pages_done`.

Не списывается:

### За страницы, которые не взялись

    `pages_failed` в счёт не идёт. Чужой сайт отдал `502` или не ответил —
    результата нет, платить не за что. Обход при этом продолжается.

### За несостоявшийся разбор

    Если `extract` не удался на конкретной странице, разбор из её счёта
    вычитается: 2 кредита вместо 5, `parsed: null`, причина в `extract_note`.
    Остальные страницы это не задевает.

### За ошибку в правиле

    `400 invalid_request` — негодный селектор, кривое регулярное выражение,
    `pages` вне диапазона, ни одного из `follow` и `next`. Проверяется до
    старта, стоит ноль.

### За отказ по правам и по балансу

    `403 feature_not_enabled` и `402 out_of_credits` приходят до старта и
    бесплатны — как и везде в API.

Начатую страницу отмена не выбрасывает: за неё браузер уже сходил, и она
попадёт и в результат, и в счёт. Подробнее — в [Заданиях](https://docs.parreq.com/crawl-jobs).

## Обход дешевле или дороже цикла из Fetch?

Дороже на кредит со страницы — и это честная цена вопроса «а какие, собственно,
адреса». Сравнение на том же каталоге из 34 страниц:

| способ | кредитов | запросов в лимитах | что нужно знать заранее |
|---|---|---|---|
| 34 × Fetch | 34 | 34 | все 34 адреса |
| один обход | 68 | 1 | начальный адрес и два селектора |

Если список адресов у вас уже есть — берите Fetch, надбавка вам не за что.
Если адреса лежат на сайте, то цикл из Fetch их не заменит: сначала пришлось
бы забрать листинги, разобрать ссылки, свести дубликаты — то есть написать
обход самому и всё равно заплатить за листинги.

## Один запрос в лимитах

Обход целиком — **один** запрос в частотных пределах: в `rpm`, в суточном и в
месячном. Двести страниц внутри задания в них не идут.

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

Объём обхода ограничивают две другие вещи: **баланс** и потолок `pages`.

> **Внимание.**
>   Опрос состояния — обычные запросы, и они в `rpm` считаются. Обход из двухсот
>   страниц, опрашиваемый в цикле без паузы, исчерпает частотный предел раньше,
>   чем сам обход дойдёт до середины. Раз в несколько секунд достаточно.

Подробности про пределы — на странице [Лимиты](https://docs.parreq.com/limits), весь прайс — на
странице [Кредиты и права](https://docs.parreq.com/pricing).
