Краулинг, индексация, ранжирование
Подробно разбираем три стадии работы поисковика и где на каждой ломается 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.