▤ Руководства

Глубокий обход сайта

Содержание

Страница /deep — обход до 10 000 страниц (лимиты 500 / 1000 / 2500 / 5000 / 10 000, максимум задаётся deep_max_pages).

Как работает

  • Очередь адресов хранится в таблице dc_url (на каждый адрес компактная строка), состояние запуска — в dc_run. Обход можно остановить и продолжить.
  • Старт: главная, robots.txt, sitemap (включая индексные, до 20 вложенных). Далее ссылки со страниц в порядке глубины.
  • Запрещённое в robots.txt не скачивается, но показывается в отчёте.
  • Адреса с параметрами ограничены 30 % лимита (не менее 50) — защита от календарей и фильтров-ловушек.
  • Одновременных запросов deep_concurrency (6), пауза deep_delay_ms (150), запусков в сутки deep_daily_runs (5), один активный запуск на сайт. Хранятся последние три запуска сайта.

Запуск

  • cron: bin/deepcrawl.php каждые несколько минут (см. deploy/crontab.example); за вызов ~50 секунд работы.
  • без cron: открытая страница запуска сама делает шаги (по 12 секунд) и обновляется.

Отчёт

21 проблема: 5xx, нет ответа, 4xx, noindex в sitemap, редиректы, нет/дубль/длинный title, нет description, нет/несколько H1, тонкие страницы, дубли контента, медленные, сироты, не в sitemap, глубоко, canonical на другой адрес, картинки без alt, закрыто robots.txt, не просмотрено из-за лимита. CSV-выгрузка по любому типу.

Сравнение

С предыдущим завершённым запуском: новые ошибки, исправленные, пропавшие страницы (только если текущий обход полный), изменённые заголовки. При новых ошибках создаётся событие crawl-deep.

Перелинковка (версия 54)

  • Во время обхода пишутся ссылки между страницами (не больше 40 на страницу лимита и 150 с одной страницы; nofollow не учитывается). После завершения считается внутренний PageRank (затухание 0,85, 25 итераций) и поиск в ширину от главной; рёбра затем удаляются, остаются вес 0–1000, клики и признак «слабая».
  • Слабая страница: индексируемая, из sitemap или не меньше 300 слов, с весом в нижней четверти или недостижимая по ссылкам.
  • Подсказки: до 15 слабых страниц, для каждой до трёх сильных страниц-доноров (не более 100 ссылок на странице), которые ещё на неё не ссылаются; выбор по общим словам заголовка и общему разделу адреса.
  • Это оценка перелинковки сайта, а не вес в поисковиках. Если ссылки отброшены по лимиту, на странице есть пометка.

Глубокий обход 2.0 (версия 60)

  • Сравнение обходов (Deep\Diff, вкладка «Сравнение обходов»): по страницам — новые, пропавшие, сменился код, noindex, canonical, редирект, title, текст (отпечаток), сократился текст, потеряны внутренние ссылки, ушли глубже, выпали из sitemap, замедлились; по проблемам — сколько появилось, ушло и сколько появилось на страницах, которые раньше были в порядке (регрессии). Можно выбрать любой из сохранённых обходов (хранятся три последних).
  • Очередь исправлений (Deep\FixQueue, CSV /deep/{сайт}/queue.csv): страницы по убыванию «ценность × тяжесть проблем». Ценность 0–100: внутренний вес 35, входящие ссылки 20, sitemap 10, текст 5, внешние домены-доноры 15, клики из поиска 15 (последние два — если загружены ссылки и подключён поиск). Все правки страницы собраны вместе, минуты — оценка.
  • Правки шаблонов: проблема у ≥10 страниц и ≥60% страниц раздела (первый сегмент пути) считается шаблонной; такие проблемы весят в очереди вдвое меньше и вынесены в отдельную таблицу.
  • Здоровье обхода (Deep\Trend): 0–100 = 100 − штраф; ошибка весит 3, внимание 1, совет 0,15 на страницу, сумма делится на 1,5 × число просмотренных страниц. История итогов (dc_hist, 40 записей на сайт) живёт дольше самих запусков; вкладка «Динамика» показывает рост и спад проблем.
  • Расписание (Deep\Sched, dc_sched): раз в 7, 14 или 30 дней; ставит обход в очередь из bin/deepcrawl.php, учитывает суточный лимит (повтор через час). Сайт, исчезнувший из мониторинга, снимается.
  • События и задачи: crawl-regress (→ причина «Ухудшение страниц между обходами»), задачи d:regress, d:tpl:*; ошибки кода ответа в регрессии не входят — их ловят прежние событие и задачи. Для проверки эффекта добавлен показатель «Здоровье глубокого обхода».

Deep Crawl 3.0 (версия 88)

  • Профили (Deep\Profile): full (настройки сервиса), gentle (2 запроса, ≤3/с, пауза 700 мс, адаптивный, 1 обработчик), fast (12 в порции, до 24 одновременно, без пауз), important (по важности, 30% бюджета), sitemap (только адреса из sitemap).
  • Важность (Deep\Priority): sitemap +30, входящие ссылки +3 (до 20), приоритет прошлого обхода, глубина −5, параметры −15; одна формула в SQL и PHP.
  • Инкрементальный режим (Deep\Incremental): срок перепроверки 7 суток (важные/часто меняющиеся — вдвое короче, стабильные малозначимые — вдвое длиннее); ошибки, редиректы и закрытые страницы перезапрашиваются всегда; запрос с If-None-Match/If-Modified-Since. Ограничения: граф ссылок и вес берутся из прошлого обхода, входящие ссылки перенесённых страниц не пересчитываются, удалённые из sitemap страницы заметны после срока.
  • Обработчики (Deep\Workers): страницы занимаются заявками (dcClaim), зависшие заявки возвращаются (dcReclaim); bin/deepcrawl.php --workers=N запускает процессы, у каждого свой lock; суммарный потолок — deep_inflight_max.
  • Бережность (Deep\Throttle): пауза по 429/503 с Retry-After (≤120 с), замедление при ≥30% ошибок или отклике >2× нормы, восстановление после 5 хороших порций.
  • Нагрузка: php bin/deepload.php --pages=300 --latency=400 --workers=1,2,4 --profile=fast. Замеры (2 ядра, SQLite): задержка 400 мс — 1 процесс 32,6 с, 2 — 20,8 с, 4 — 21,4 с; при 100 мс выигрыша нет. Это оценка на синтетическом сайте.

Ограничения

Проверено на подставном сайте; JS-рендеринг не выполняется (для таких сайтов используйте проверку с рендером).

Гигиена адресов (v91)

ПроблемаУровеньУсловие
url_caseпредупреждениедва и более скачанных HTML-адреса совпадают без учёта регистра
p_sessошибкав запросе PHPSESSID, sessionid, sid или jsessionid; страница индексируема, без canonical на другой адрес
p_trackпредупреждениеutm_*, gclid, yclid, fbclid, openstat, ysclid; те же условия
p_sortинфоsort, order, orderby, filter, view, limit, dir; те же условия

Классификация для обычного обхода — Deep\UrlParams::kind(); в SQL глубокого обхода те же имена задаются условиями LIKE по LOWER(url). Проблемы p_* в очереди исправлений считаются правкой шаблона.

Несколько серверов (v105)

Обход можно вести сразу с нескольких узлов: общий предел запросов к сайту, лидер расписания, лимиты тарифа на обработчиков и параллельные обходы, возврат работы упавшего узла. Настройка, проверка и soak-тест — в docs/CLUSTER.md.