Анализ и устранение каннибализации ключевых слов на сайте
Каннибализация — это когда несколько страниц сайта конкурируют за один и тот же поисковый запрос. Google видит две релевантных страницы, не знает которую ранжировать выше, и в итоге понижает обе. Проблема хуже всего проявляется на крупных сайтах: интернет-магазинах с сотнями категорий, корпоративных порталах с историей правок, блогах с накопленной базой статей.
Симптомы неочевидны: страница есть в индексе, ключевые слова в топ-20, но позиция не растёт годами. Аудит через Ahrefs или Search Console покажет, что Google поочерёдно ранжирует то одну страницу, то другую по одному запросу — типичный cannibalization signal.
Выявление каннибализации
Через Google Search Console:
Отчёт Performance → Pages. Экспортируем таблицу кликов/показов по страницам. Затем повторяем по Queries. Соединяем две таблицы в Python или Google Sheets: ищем запросы, где impressions распределены между 2+ URL.
import pandas as pd
pages_df = pd.read_csv('gsc_pages.csv') # Page, Clicks, Impressions, CTR, Position
queries_df = pd.read_csv('gsc_queries.csv') # Query, Clicks, Impressions, CTR, Position
# GSC API через google-search-console python клиент
from googleapiclient.discovery import build
service = build('searchconsole', 'v1', credentials=creds)
response = service.searchanalytics().query(
siteUrl='https://example.com',
body={
'startDate': '2024-01-01',
'endDate': '2024-03-31',
'dimensions': ['query', 'page'],
'rowLimit': 25000
}
).execute()
rows = response.get('rows', [])
df = pd.DataFrame([{
'query': r['keys'][0],
'page': r['keys'][1],
'clicks': r['clicks'],
'impressions': r['impressions'],
'position': r['position']
} for r in rows])
# Находим запросы с несколькими конкурирующими страницами
cannibal = df.groupby('query').filter(lambda g: len(g) > 1 and g['impressions'].sum() > 100)
cannibal_sorted = cannibal.sort_values(['query', 'impressions'], ascending=[True, False])
Через Screaming Frog + Ahrefs:
В Ahrefs: Site Explorer → Pages → Best by Links → экспорт. Screaming Frog crawl с включённым Custom Extraction для <title> и <h1>. Ищем страницы с идентичными или близкими title.
Дополнительно — Ahrefs Organic Keywords: фильтруем по позиции 4–20 (зона нестабильного ранжирования), смотрим на какие URL приходит одинаковый запрос.
Операторный запрос для быстрой проверки:
site:example.com "keyword phrase"
Если в выдаче 3+ страниц одного сайта по одному запросу — прямой сигнал.
Классификация случаев
Не каждая каннибализация одинакова. Прежде чем действовать — классифицируем:
Тип 1: Явный дубль. Две страницы с одинаковым контентом и одинаковыми ключами. Решение: canonical или 301 редирект.
Тип 2: Семантическое пересечение. Страница категории и статья блога конкурируют за информационный запрос. Решение: переработка контента, разграничение интента.
Тип 3: Исторический мусор. Старые страницы пагинации, архивы тегов, устаревшие лендинги. Решение: noindex или 410.
Тип 4: Плановая каннибализация. На одном запросе специально существуют landing + blog post — ошибка архитектуры контент-стратегии. Решение: слияние или переориентация.
Устранение: технические методы
301 редирект (Apache/Nginx):
# nginx.conf
server {
location = /old-page/ {
return 301 /canonical-page/;
}
}
# .htaccess
Redirect 301 /old-page/ https://example.com/canonical-page/
Canonical tag:
Когда страницы должны оставаться доступными (например, пагинация), но вес нужно консолидировать:
<!-- На /product-category/?page=2 -->
<link rel="canonical" href="https://example.com/product-category/" />
Важно: canonical — это рекомендация, не директива. Google может проигнорировать, если страница значительно отличается по контенту.
Noindex для страниц с низкой ценностью:
<meta name="robots" content="noindex, follow" />
Или через HTTP-заголовок (актуально для динамических фильтров):
X-Robots-Tag: noindex, follow
Слияние страниц через контент:
Когда каннибализируют две сильные страницы с разными ссылочными профилями — 301 будет потерей. Правильнее: объединить контент в одну исчерпывающую страницу, поставить 301 с более слабой, перераспределить внутренние ссылки.
Работа с внутренней перелинковкой
Каннибализация часто усиливается внутренней перелинковкой. Если анкоры «купить iPhone 15» ведут одновременно на /iphone-15/ и /catalog/iphone/15/ — Google видит конкуренцию.
Аудит анкоров через Screaming Frog: Configuration → Custom → Extract → выбираем все <a href> с нужными ключами. Либо через Ahrefs Internal Backlinks.
Правило: один и тот же коммерческий анкор должен ссылаться только на одну страницу на всём сайте.
После исправлений: отслеживание
Google обновляет позиции через 2–6 недель после индексации изменений. Ускоряем:
Google Search Console → URL Inspection → Request Indexing
Для пакетной переиндексации — Indexing API (для новостных/авторизованных сайтов):
from googleapiclient.discovery import build
import json
service = build('indexing', 'v3', credentials=creds)
batch = service.new_batch_http_request()
urls_to_notify = [
'https://example.com/canonical-page/',
# ...
]
for url in urls_to_notify:
batch.add(service.urlNotifications().publish(
body={'url': url, 'type': 'URL_UPDATED'}
))
batch.execute()
Сроки
Аудит сайта до 1000 страниц — 3–5 рабочих дней: краулинг, экспорт GSC, анализ, составление карты каннибализации с приоритетами. Реализация технических правок (canonical, редиректы, noindex) — дополнительно 2–3 дня. Контентные правки (переписывание, слияние страниц) — от 5 дней в зависимости от объёма.







