Аналіз та оптимізація індексації сторінок (Index Coverage)
Index Coverage — співвідношення між сторінками на вашому сайті та сторінками, які Google справді проіндексував. Багато SEO-проблем з трафіком пояснюються не якістю контенту, а тим, що сторінки просто не потрапили в індекс.
Google Search Console: Coverage звіт
GSC → Index → Pages ділить усі виявлені URL на категорії:
Indexed — сторінки в індексі (мета: 80–95% від загального числа URL).
Crawled - currently not indexed — Google бачив, але не індексував. Причини: thin content, низька якість, занадто багато подібного контенту.
Discovered - currently not indexed — Google знайшов URL, але ще не краулив. Звичайно через перевантаження crawl budget.
Not indexed — noindex — явна директива не індексувати.
Duplicate — дублюючи сторінки (Google вибрав canonical).
Excluded by robots.txt — заблоковані в robots.txt.
Вивезення всіх URL та їх статусів
# Google Search Console API
from googleapiclient.discovery import build
from oauth2client.service_account import ServiceAccountCredentials
credentials = ServiceAccountCredentials.from_json_keyfile_name(
'gsc-credentials.json',
['https://www.googleapis.com/auth/webmasters.readonly']
)
service = build('searchconsole', 'v1', credentials=credentials)
# URL Inspection API — перевірити конкретний URL
response = service.urlInspection().index().inspect(
body={
'inspectionUrl': 'https://company.com/products/iphone-15',
'siteUrl': 'https://company.com/'
}
).execute()
indexing_state = response['inspectionResult']['indexStatusResult']['indexingState']
# INDEXING_ALLOWED, NOT_INDEXED, etc.
Діагностика "Crawled - currently not indexed"
Найбільш складна категорія для виправлення — Google бачит сторінку, але не вважає її гідною індексації.
def diagnose_not_indexed_pages(urls):
issues = []
for url in urls:
response = requests.get(url)
soup = BeautifulSoup(response.text, 'html.parser')
# Кількість слів
text = ' '.join(soup.get_text().split())
word_count = len(text.split())
# Перевірка унікальності title
title = soup.find('title').text if soup.find('title') else ''
issues.append({
'url': url,
'word_count': word_count,
'title': title,
'has_canonical': bool(soup.find('link', rel='canonical')),
'robots': soup.find('meta', attrs={'name': 'robots'}),
'h1_count': len(soup.find_all('h1')),
})
# Thin content
thin = [p for p in issues if p['word_count'] < 300]
print(f"Thin content ({len(thin)} pages):")
for p in thin[:10]:
print(f" {p['url']}: {p['word_count']} слів")
Виправлення поширених проблем
Thin content — менше 300 слів. Рішення: розширити або об'єднати подібні сторінки.
Дублюючийся контент без canonical: додати canonical до всіх варіантів URL.
Noindex по помилці: пошукати noindex у шаблонах та видалити з важливих сторінок.
Сторінки тільки за аутентифікацією: публічний контент повинен бути доступний без cookies.
Sitemap як інструмент індексації
<?xml version="1.0" encoding="UTF-8"?>
<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">
<url>
<loc>https://company.com/products/iphone-15</loc>
<lastmod>2024-03-15</lastmod>
<changefreq>weekly</changefreq>
<priority>0.9</priority>
</url>
</urlset>
Ping Google про оновлення sitemap:
curl "https://www.google.com/ping?sitemap=https://company.com/sitemap.xml"
IndexNow API (Bing, Yandex):
curl -X POST https://api.indexnow.org/IndexNow \
-H "Content-Type: application/json" \
-d '{
"host": "company.com",
"key": "your-key",
"urlList": ["https://company.com/new-page"]
}'
Моніторинг динаміки індексації
def track_indexation_rate(history_db):
"""Відстежувати % проіндексованих сторінок у динаміці"""
total_published = count_published_pages()
indexed_count = get_gsc_indexed_count()
rate = indexed_count / total_published * 100
history_db.save({'date': datetime.now(), 'rate': rate})
# Алерт при снідженні
last_week = history_db.get_7days_ago()
if rate < last_week.rate - 5:
send_alert(f"Index coverage dropped from {last_week.rate:.1f}% to {rate:.1f}%")
Тривалість
Аудит Index Coverage + план устранення проблем — 2–3 робочих дні.







