Глубокий обход сайта
Содержание
Страница /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.