Оптимизация Internal Linking Structure сайта
Internal Linking — система внутренних ссылок, которая распределяет ссылочный вес (PageRank) между страницами и помогает поисковым роботам обнаруживать и индексировать контент. Правильная структура делает важные страницы более авторитетными.
Аудит текущей структуры
import scrapy
import networkx as nx
class InternalLinksSpider(scrapy.Spider):
name = 'internal_links'
start_urls = ['https://company.com']
def __init__(self):
self.graph = nx.DiGraph()
def parse(self, response):
current_url = response.url
for link in response.css('a[href]::attr(href)').getall():
absolute = response.urljoin(link)
if 'company.com' in absolute:
self.graph.add_edge(current_url, absolute)
yield response.follow(absolute, self.parse)
def closed(self, reason):
# Страницы с наибольшим PageRank
pagerank = nx.pagerank(self.graph)
top_pages = sorted(pagerank.items(), key=lambda x: x[1], reverse=True)[:20]
# Страницы без входящих ссылок (orphan pages)
orphans = [node for node in self.graph.nodes()
if self.graph.in_degree(node) == 0
and node != 'https://company.com']
print(f"Orphan pages: {len(orphans)}")
for url in orphans[:10]:
print(f" {url}")
Метрики для анализа:
- Orphan pages — страницы без входящих внутренних ссылок
- Crawl depth — глубина вложенности (важные страницы должны быть в 1–3 клика от главной)
- PageRank distribution — равномерно ли распределён вес
Принципы правильной структуры
Плоская иерархия — важные страницы близко к главной:
Главная → Категория → Страница товара (максимум 3 клика)
Тематические кластеры — страницы по одной теме ссылаются друг на друга:
Pillar page (основная): /guide/seo
↔ /guide/seo/technical
↔ /guide/seo/on-page
↔ /guide/seo/link-building
↔ /guide/seo/tools
Хлебные крошки — автоматические внутренние ссылки с Schema.org разметкой:
<nav aria-label="breadcrumb">
<ol itemscope itemtype="https://schema.org/BreadcrumbList">
<li itemprop="itemListElement" itemscope itemtype="https://schema.org/ListItem">
<a itemprop="item" href="/"><span itemprop="name">Главная</span></a>
<meta itemprop="position" content="1">
</li>
<li itemprop="itemListElement" itemscope itemtype="https://schema.org/ListItem">
<a itemprop="item" href="/catalog/phones"><span itemprop="name">Телефоны</span></a>
<meta itemprop="position" content="2">
</li>
</ol>
</nav>
Автоматические связанные статьи
from sklearn.feature_extraction.text import TfidfVectorizer
from sklearn.metrics.pairwise import cosine_similarity
def find_related_articles(target_article, all_articles, top_n=5):
texts = [a['title'] + ' ' + a['body'] for a in all_articles]
target_text = target_article['title'] + ' ' + target_article['body']
vectorizer = TfidfVectorizer(max_features=1000, stop_words='english')
tfidf_matrix = vectorizer.fit_transform([target_text] + texts)
similarities = cosine_similarity(tfidf_matrix[0:1], tfidf_matrix[1:]).flatten()
top_indices = similarities.argsort()[-top_n:][::-1]
return [all_articles[i] for i in top_indices if similarities[i] > 0.1]
Anchor text оптимизация
Anchor text ссылки сообщает поисковику о теме целевой страницы:
Плохо: <a href="/guide/seo">здесь</a>
Плохо: <a href="/guide/seo">нажмите</a>
Плохо: <a href="/guide/seo">читать дальше</a>
Хорошо: <a href="/guide/seo">руководство по SEO</a>
Хорошо: <a href="/guide/technical-seo">технический SEO аудит</a>
Проверка разнообразия anchor text:
def analyze_anchors(graph_edges):
anchor_distribution = {}
for source, target, data in graph_edges:
anchor = data.get('anchor', '').lower()
if target not in anchor_distribution:
anchor_distribution[target] = []
anchor_distribution[target].append(anchor)
# Найти страницы с однообразными anchor text
for url, anchors in anchor_distribution.items():
if len(set(anchors)) == 1 and len(anchors) > 3:
print(f"Monotonous anchors for {url}: '{anchors[0]}'")
Исправление orphan pages
def fix_orphan_pages(orphan_urls, content_db):
"""Найти логичное место для добавления ссылок на orphan-страницы"""
for url in orphan_urls:
page = content_db.get_by_url(url)
keywords = extract_keywords(page['title'])
# Найти страницы, где упоминаются эти ключевые слова
related = content_db.search(keywords, exclude_url=url, limit=5)
for related_page in related:
print(f"Add link to {url} from {related_page['url']}")
# Предложение: добавить блок "Связанные материалы"
Срок выполнения
Аудит internal linking + разработка рекомендаций по улучшению структуры — 2–3 рабочих дня.







