Создать URL
Генератор Правила транслитерации Как сделать ЧПУ Блог Вопросы и ответы Создать URL
Практика

Скрипт для поиска страниц-сирот

Идея проста: «все страницы» минус «страницы, найденные по ссылкам». Реализуем её скриптом.

Идея метода

Страницы-сироты невидимы для краулера, который ходит по ссылкам. Поэтому нужен второй источник, знающий о страницах независимо от ссылок: карта сайта, база данных, журнал сервера, аналитика. Всё, что есть во втором источнике, но не найдено обходом, — кандидат в сироты. Что делать с найденными страницами, описано в статье про страницы без входящих ссылок.

ИсточникиадресовОбходпо ссылкамКарта сайтаи база данныхЖурналыи аналитика
ИсточникиадресовОбходпо ссылкамКарта сайтаи база данныхЖурналыи аналитика
Три вида источников

Что использовать в качестве полного списка

Источники полного списка страниц
ИсточникПлюсыМинусы
Карта сайтаПросто получитьМожет содержать не все страницы
База данных или система управленияСамый полный списокНужен доступ и знание структуры
Журналы сервераПоказывают реально запрашиваемые адресаМного мусора, включая ошибки
АналитикаАдреса с реальными визитамиНе видны страницы без посетителей
Отчёты вебмастеровСтраницы, известные поисковой системеОграниченная выгрузка

Скрипт

import csv
import xml.etree.ElementTree as ET

ns = {"s": "http://www.sitemaps.org/schemas/sitemap/0.9"}
tree = ET.parse("sitemap.xml")
sitemap_urls = {loc.text.strip() for loc in tree.getroot().findall(".//s:loc", ns)}

with open("crawl.csv", newline="", encoding="utf-8") as f:
    crawled = {row["url"] for row in csv.DictReader(f)}

orphans = sorted(sitemap_urls - crawled)
print(len(orphans), "orphans")
for url in orphans[:50]:
    print(url)

Скрипт читает адреса из карты сайта и из выгрузки обхода и печатает адреса, которые есть в карте, но не найдены по ссылкам. Для карт из нескольких файлов нужно прочитать каждый файл. Адреса должны быть в одном формате: одинаковые протокол, слеш в конце и регистр.

Как читать результат

Разбор списка сирот
Что видимВозможная причинаЧто делать
Страницы в карте, но без входящих ссылокЗабыли добавить ссылкиСвязать с разделами
Служебные страницы в картеОшибка генерации картыИсключить из карты
Много страниц одного разделаСломан блок навигации разделаИсправить шаблон
Старые адресаУдалены из навигации, но остались в картеУбрать или перенаправить
Адреса с ошибкой форматаНесовпадение слеша или регистраНормализовать и повторить

Регулярный запуск

СвежийобходСвежаякартаСкриптсравненияОтчётв рабочийчат
СвежийобходСвежаякартаСкриптсравненияОтчётв рабочийчат
Как запускать по расписанию
  1. Раз в месяц запускайте обход и генерацию карты, затем скрипт.
  2. Сохраняйте результаты и сравнивайте с прошлым запуском: рост числа сирот — сигнал.
  3. Добавьте в отчёт число сирот по разделам: сегменты по разделам.

Не путайте с редкими ссылками. Страница с одной ссылкой из подвала — не сирота, но тоже слаба. Как искать сирот вручную — в статье про страницы-сироты, а как считать распределение ссылок — в статье расчёт веса внутри сайта.

Частые вопросы

Почему краулер не находит сирот?

Он обходит сайт по ссылкам, а на такие страницы ссылок нет; их находят сравнением с независимым списком страниц.

Какой источник полного списка лучше?

Самый полный — база данных или система управления; на практике часто начинают с карты сайта и дополняют журналами и аналитикой.

Почему важно приводить адреса к одному формату?

Различия в слеше, регистре и протоколе создают ложные расхождения, и одни и те же страницы попадают в список сирот.

Готовый адрес можно собрать прямо сейчас: откройте генератор ЧПУ — он транслитерирует фразу по таблице Яндекса, уберёт служебные слова и покажет длину адреса.

Читайте также