Краулинг, индексация, ранжирование

Подробно разбираем три стадии работы поисковика и где на каждой ломается SEO.

Инвертированный индекс — структура данных вида «слово → список страниц, где оно встречается». Именно по ней поисковик мгновенно находит кандидатов на запрос.

Краулинг: как бот находит страницы

У поисковика есть очередь URL на обход (crawl queue). Туда URL попадают тремя путями: из ранее найденных ссылок, из sitemap.xml и через ручную отправку в Search Console. Бот берёт URL из очереди, делает HTTP-запрос и сохраняет ответ. Новые ссылки со страницы добавляются в очередь — так обход расходится по сайту.

Отсюда практический вывод: страница, на которую нет ни одной ссылки и которой нет в sitemap, может быть вообще не найдена. Это называется «страница-сирота» (orphan page).

Очередь обхода:
  /              -- стартовая, есть ссылки на /blog, /about
  /blog          -- ссылки на /blog/post-1, /blog/post-2
  /blog/post-1
  /blog/post-2
  /secret        -- НЕТ ссылок и нет в sitemap -> бот её не найдёт

Индексация: разбор и рендеринг

Скачав HTML, поисковик его парсит: извлекает текст, заголовки, ссылки, мета-теги. Если контент рисуется JavaScript-ом, страница уходит в очередь на рендеринг — поисковик запускает headless-браузер, исполняет JS и смотрит на итоговый DOM. Только после этого решается, класть ли страницу в индекс.

На этой стадии страница может НЕ попасть в индекс, если: стоит <meta name="robots" content="noindex">; canonical указывает на другой URL; контент дублирует другую страницу; после рендера тело пустое (типичная беда SPA).

Ранжирование: выбор и сортировка

Когда пользователь вводит запрос, поисковик по инвертированному индексу мгновенно достаёт страницы-кандидаты, а затем сортирует их по сотням сигналов. Для разработчика важны технические сигналы, на которые он влияет напрямую:

  • скорость и стабильность загрузки (Core Web Vitals);
  • мобильная адаптивность (mobile-first индексация);
  • HTTPS;
  • корректность структурированных данных и заголовков.

Как работает под капотом

Упрощённая модель индекса — словарь, где ключ это слово, а значение — множество страниц. На запрос из нескольких слов поисковик берёт пересечение множеств. Поэкспериментируем с этой идеей на чистом Python:

pages = {
    "/python": "учим python циклы и функции",
    "/sql": "sql запросы и базы данных",
    "/python-sql": "python и sql для аналитики данных",
}

# Строим инвертированный индекс: слово -> множество URL
index = {}
for url, text in pages.items():
    for word in text.split():
        index.setdefault(word, set()).add(url)

def search(query):
    words = query.split()
    result = None
    for w in words:
        urls = index.get(w, set())
        result = urls if result is None else result & urls
    return sorted(result or [])

print("python:", search("python"))
print("python sql:", search("python sql"))
print("данных:", search("данных"))

Вывод:

python: ['/python', '/python-sql']
python sql: ['/python-sql']
данных: ['/python-sql', '/sql']

Реальные индексы устроены несравнимо сложнее (стемминг, веса слов, ссылочные сигналы), но принцип «слово → страницы → пересечение» лежит в основе.

Частые ошибки

  • Страницы-сироты. На важные страницы нет внутренних ссылок и их нет в sitemap — бот их не найдёт.
  • Путать «бот скачал» и «страница в индексе». Краул ≠ индексация. Проверяйте статус индексации в Search Console, а не только логи доступа.
  • Ждать мгновенного результата. Между краулом и попаданием в индекс проходит время, особенно для JS-страниц, ждущих рендера.

Итог

  • Краулинг идёт по очереди URL, наполняемой ссылками, sitemap и ручной отправкой.
  • Индексация включает парсинг и, при необходимости, рендеринг JS; здесь страница может «выпасть».
  • Ранжирование сортирует кандидатов; разработчик влияет на технические сигналы — скорость, мобильность, HTTPS.
Проверьте себя
1. Что такое «страница-сирота» (orphan page)?
AСтраница с дублирующимся контентом
BСтраница без внутренних ссылок и без записи в sitemap — бот может её не найти
CСтраница с ошибкой 404
DСтраница, закрытая через noindex
2. Почему факт «бот скачал страницу» не означает, что она в индексе?
AСкачивание и индексация — это одно и то же
BПосле краула страница может не пройти индексацию из-за noindex, canonical или дублей
CБот никогда не скачивает страницы, которые потом индексирует
DИндекс обновляется только раз в год
3. На каком из сигналов ранжирования разработчик влияет напрямую через код?
AКоличество упоминаний бренда в СМИ
BВозраст домена
CСкорость загрузки и стабильность страницы (Core Web Vitals)
DТематика запроса пользователя