Open source · Rust · CLI. Разбор опубликованного исходного кода 06879810. Команды относятся к краулеру, а не к ранней версии библиотеки HTML-парсинга.
От ссылок одной страницы к устройству сайта
ahref начинался как небольшой парсер ссылок. Я переделал его в CLI, который обходит внутренние HTML-страницы и сохраняет ориентированный граф. Задача изменилась: отдельный список href не объясняет, как посетитель достигает статьи, какие страницы известны только из sitemap и какие ссылки действительно ведут на проверенную ошибку.
Я спроектировал обход, модель наблюдений, расчёт метрик и экспорт. Мне нужен результат, который можно анализировать повторно и передавать другим инструментам. Поэтому сеть отвечает за сбор, а граф сохраняется независимо от конкретной визуализации. История изменений сайта и сопоставление с поисковым трафиком остаются задачами SEO Version Control и SEO Agent.
- HTML и sitemapИсходные страницы, ссылки и известные URL
- Ограниченный обходHTTP, robots, нормализация, состояния загрузки
- Версионный графМетрики и экспорт JSON, GraphML, DOT
Сохранённый JSON позволяет повторить анализ без нового обращения к сайту. Граф содержит наблюдения, а не рекомендацию поисковой системы.
Найти страницу, доступную только из sitemap
Для собственного сайта я могу начать обход с sitemap, ограничить бюджет и сохранить граф. Последующие команды читают файл локально:
ahref crawl https://opatsay.com/sitemap.xml --max-pages 200 --concurrency 2 --output graph.json
ahref analyze graph.json --output analyzed.json
ahref export analyzed.json --format dot --output site.dot
При подготовке кейса я проверил этот сценарий на отдельном трёхстраничном HTTP-сайте. Главная ссылалась на /guide, он — обратно на главную; /orphan присутствовал только в sitemap. Краулер загрузил три страницы и сохранил две гиперссылки. У /orphan получились depth: null, нулевая входящая степень и статус кандидата в сироты. Offline-анализ и экспорт DOT прошли на том же файле.
Это синтетическая проверка, не результат аудита opatsay.com. Полезный следующий шаг на реальном сайте — открыть найденную страницу и проверить, нужна ли ей контекстная ссылка. Само присутствие URL в sitemap ещё не делает страницу достижимой через навигацию.
Три решения, от которых зависит смысл отчёта
Разделить глубину обхода и расстояние от главной
Sitemap добавляет исходные URL в очередь, но они не становятся страницами нулевой глубины в готовом отчёте. Финальная глубина пересчитывается от главной по ссылкам и редиректам. Иначе сирота выглядела бы так же доступно, как главная. При неполном обходе отсутствие входящих ссылок остаётся наблюдением, а не доказательством их отсутствия на всём сайте.
Не смешивать ссылки, переходы и ошибки
Граф сохраняет отдельные вхождения гиперссылок с анкорами и rel; степень и PageRank используют уникальных соседей. Редирект хранится отдельно и не превращается в выдуманную ссылку. Битый адрес требует наблюдённого HTTP-статуса ошибки. Тайм-аут, запрещённая robots страница и ещё не загруженный URL имеют другие состояния, поэтому автоматический потребитель может различать причины неполноты.
Ограничить сеть, сохранив пригодный результат
Бюджет страниц учитывает запросы с ошибками и переходы по редиректам. Параллелизм и размер декодированного тела ограничены, каждый новый адрес редиректа проходит проверку области обхода и robots. HTML удаляется после извлечения ссылок; остаются граф и метаданные. Успешное завершение CLI означает создание отчёта, но не гарантирует успешную загрузку всех известных страниц.
Проверяемый результат
На версии 06879810 команда cargo test --locked --test crawl выполнила десять интеграционных тестов: все прошли. Они поднимают синтетический сайт на loopback и проверяют граф, ограничения запросов, ошибки, sitemap и экспорт. Это воспроизводимая проверка поведения без внешних сайтов; она не является бенчмарком производительности.
Можно открыть тест глубины sitemap-сироты, проверку редиректов и конечных ошибок, контракт машинного stdout и схему графа. Сохранение JSON и раздельный stderr позволяют включать краулер в собственные сборщики.
Ограничения анализа
Краулер не исполняет JavaScript, не проверяет статусы внешних ссылок и не ищет sitemap автоматически. Чтобы использовать карту, передай её адрес. Внутренний PageRank описывает полученный граф, учитывает в том числе nofollow и не воспроизводит рейтинг Google. Порядок и значения query-параметров, HTTP/HTTPS и завершающий слеш сохраняют различия; это может увеличить граф, но не склеивает потенциально разные ресурсы.
Собрать текущий краулер
Нужен Rust 1.90 или новее. Установка из checkout исключает путаницу с ранними пакетами, которые содержали только парсер:
git clone https://github.com/tenqz/ahref.git
cd ahref
cargo install --path . --locked
ahref --version
Начни с небольшого бюджета на своём сайте, сохрани JSON и проверь предупреждения перед выводами. Статья об ahref продолжает сценарий анализа; описание архитектуры раскрывает очереди, память и модель графа.