Идея метода
Страницы-сироты невидимы для краулера, который ходит по ссылкам. Поэтому нужен второй источник, знающий о страницах независимо от ссылок: карта сайта, база данных, журнал сервера, аналитика. Всё, что есть во втором источнике, но не найдено обходом, — кандидат в сироты. Что делать с найденными страницами, описано в статье про страницы без входящих ссылок.
Что использовать в качестве полного списка
| Источник | Плюсы | Минусы |
|---|---|---|
| Карта сайта | Просто получить | Может содержать не все страницы |
| База данных или система управления | Самый полный список | Нужен доступ и знание структуры |
| Журналы сервера | Показывают реально запрашиваемые адреса | Много мусора, включая ошибки |
| Аналитика | Адреса с реальными визитами | Не видны страницы без посетителей |
| Отчёты вебмастеров | Страницы, известные поисковой системе | Ограниченная выгрузка |
Скрипт
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)
Скрипт читает адреса из карты сайта и из выгрузки обхода и печатает адреса, которые есть в карте, но не найдены по ссылкам. Для карт из нескольких файлов нужно прочитать каждый файл. Адреса должны быть в одном формате: одинаковые протокол, слеш в конце и регистр.
Как читать результат
| Что видим | Возможная причина | Что делать |
|---|---|---|
| Страницы в карте, но без входящих ссылок | Забыли добавить ссылки | Связать с разделами |
| Служебные страницы в карте | Ошибка генерации карты | Исключить из карты |
| Много страниц одного раздела | Сломан блок навигации раздела | Исправить шаблон |
| Старые адреса | Удалены из навигации, но остались в карте | Убрать или перенаправить |
| Адреса с ошибкой формата | Несовпадение слеша или регистра | Нормализовать и повторить |
Регулярный запуск
- Раз в месяц запускайте обход и генерацию карты, затем скрипт.
- Сохраняйте результаты и сравнивайте с прошлым запуском: рост числа сирот — сигнал.
- Добавьте в отчёт число сирот по разделам: сегменты по разделам.
Не путайте с редкими ссылками. Страница с одной ссылкой из подвала — не сирота, но тоже слаба. Как искать сирот вручную — в статье про страницы-сироты, а как считать распределение ссылок — в статье расчёт веса внутри сайта.
Частые вопросы
Почему краулер не находит сирот?
Он обходит сайт по ссылкам, а на такие страницы ссылок нет; их находят сравнением с независимым списком страниц.
Какой источник полного списка лучше?
Самый полный — база данных или система управления; на практике часто начинают с карты сайта и дополняют журналами и аналитикой.
Почему важно приводить адреса к одному формату?
Различия в слеше, регистре и протоколе создают ложные расхождения, и одни и те же страницы попадают в список сирот.
Готовый адрес можно собрать прямо сейчас: откройте генератор ЧПУ — он транслитерирует фразу по таблице Яндекса, уберёт служебные слова и покажет длину адреса.