crawl4ai-seo
SEO-краулер для аудита сайтов и конкурентного анализа. Отвечает на вопрос: "что реально лежит на страницах и как сайт устроен изнутри".
Не заменяет SERP-инструменты (позиции, видимость) — дополняет их данными о содержимом и структуре страниц.
Что умеет
| Задача |
Описание |
| Site inventory |
Полная инвентаризация страниц: URL, status, title, H1, meta, canonical, word count |
| On-page audit |
Поиск проблем: пустые title/H1, дубли заголовков, битые canonical, thin content |
| Internal linking audit |
Граф внутренних ссылок, orphan pages (0 входящих), слабо связанные страницы |
| Navigation audit |
Breadcrumbs, nav-блоки, menu consistency, hub-страницы без исходящих ссылок |
| Landing comparison |
Сравнение shortlist URL по on-page сигналам (title, H1, content, links) |
| Competitor research |
Прогон страниц конкурентов через тот же pipeline, сравнение шаблонов |
Config
Глобальные defaults: config/defaults.example.json, локальный override — config/defaults.json.
Подробности: config/README.md.
Правило: в defaults не храним конкретный сайт или параметры клиента. Всё site-specific приходит через launch params и фиксируется в cache/jobs/<job_id>/resolved_config.json.
Workflow
Перед любым crawl
Проверь окружение:
python3 scripts/doctor.py
Если crawl4ai/playwright не готовы — остановись на seed/discovery, не имитируй crawl.
Определи цель исследования:
- Полный аудит сайта → site inventory + navigation audit
- Аудит лендингов → landing comparison
- Анализ конкурентов → competitor research
- Аудит перелинковки → internal linking audit
Собери launch params:
target.domain — домен исследования
job.project — проект/клиент
job.label — метка запуска
Основной pipeline
# 1. Создать job
python3 scripts/init_job.py --domain https://example.com --project client-a --label full-audit
# 2. Собрать seed URL из sitemap/robots
python3 scripts/seed_urls.py --job-id <job_id>
# 3. Запустить crawl
uv run --script scripts/crawl_batch.py --job-id <job_id>
# 4. Построить навигационный отчёт
python3 scripts/build_navigation_report.py \
--seed-job-id <seed_job_id> \
--crawl-job-id <crawl_job_id> \
--report-dir reports/<project>/<label>
# 5. Сравнить страницы
python3 scripts/compare_pages.py --job-id <job_id>
Быстрый вариант (без отдельного init)
python3 scripts/seed_urls.py --domain https://example.com --project client-a --label quick-check
uv run --script scripts/crawl_batch.py --job-id <job_id>
Scripts
| Script |
Назначение |
doctor.py |
Проверка окружения: uv, Python, crawl4ai, playwright, config |
init_job.py |
Создание job: job_id, launch_params.json, resolved_config.json |
seed_urls.py |
Discovery URL из sitemap/robots/файла → seed.json (работает без crawl4ai) |
crawl_batch.py |
Batch crawl через crawl4ai → pages.ndjson, links.ndjson, summary.json |
compare_pages.py |
Табличное сравнение crawled pages по on-page сигналам |
build_navigation_report.py |
Сводный навигационный аудит: orphans, weak hubs, breadcrumbs, menu drift |
common.py |
Shared helpers (не запускать напрямую) |
Extracted SEO Signals
На каждую страницу (pages.ndjson) извлекаются:
On-page: title, description, keywords, canonical, robots, og:title, og:description, og:image, H1, headings hierarchy, word count.
Navigation: path depth, breadcrumbs (texts + URLs), nav blocks count, nav links count, nav URLs sample.
Links: internal/external links count. В links.ndjson — полный граф: source → target, anchor text, nofollow, same_domain.
Navigation Audit Findings
build_navigation_report.py автоматически находит:
| Проблема |
Что значит для SEO |
| Orphan pages (0 входящих ссылок) |
Поисковик не найдёт страницу или не передаст ей вес |
| Weakly linked (1 входящая) |
Страница получает минимум link equity |
| Missing breadcrumbs |
Нет навигационной цепочки для бота и пользователя |
| Breadcrumb inconsistency |
Разные trail signatures в одной секции — путаница в иерархии |
| Weak nav template |
Hub-страница с подозрительно малым числом nav-ссылок |
| Menu inconsistency |
Страницы теряют часть common nav targets (шаблон "дрейфует") |
| Weak hubs |
Категория/раздел отдаёт <5 внутренних ссылок |
| Duplicate titles |
Несколько страниц с одинаковым title — каннибализация |
| Canonical mismatches |
canonical указывает не на себя |
| Technical junk |
login-URL, php endpoints, asset-ссылки в навигационном слое |
| Linked-not-seeded |
Сайт линкует URL, которых нет в sitemap |
Связка с другими скиллами
| Сценарий |
Скилл-партнёр |
Порядок |
| SERP → on-page audit |
yandex-search-api |
Получи shortlist из SERP → прогони через crawl4ai |
| Organic landings → audit |
yandex-metrika |
Возьми top organic pages → проверь on-page quality |
| Индексация + audit |
yandex-webmaster |
Сравни indexed pages с crawled inventory |
| Anti-block fallback |
scrapedo-web-scraper |
При блокировке crawl4ai — fallback через Scrape.do |
Cache Layout
cache/jobs/<job_id>/
launch_params.json # raw params этого запуска
resolved_config.json # effective config после merge defaults + params
manifest.json # operational state и artifact paths
seed.json # seed URLs и метаданные discovery
pages.ndjson # одна запись на страницу
links.ndjson # одна запись на link edge
summary.json # компактная сводка
markdown/ # сохранённый markdown контент
Каждый job изолирован. Параллельные запуски по разным сайтам безопасны.
Output Hygiene
- stdout: только preview и пути к файлам.
- Полные данные: только в job files.
- Для анализа используй
rg, head, wc -l по ndjson-файлам, не поднимай browser повторно.
References
- Workflow recipes and integration scenarios
- Cache layout and output schema
1---2name: crawl4ai-seo3description: SEO-краулер сайтов на базе Crawl4AI. Полный аудит страниц: title, meta, H1, canonical, breadcrumbs, навигация, внутренние ссылки. Инвентаризация сайта, навигационный аудит, сравнение лендингов, анализ конкурентов. Работает для Google и Яндекс SEO (Cyrillic URL, коммерческие факторы, региональность). Связка с yandex-search-api, yandex-metrika, yandex-webmaster, scrapedo-web-scraper. Triggers: crawl4ai, seo crawl, site audit, page inventory, site inventory, on-page audit, internal links, internal linking audit, navigation audit, landing comparison, competitor analysis, competitor pages, orphan pages, technical seo, аудит сайта, краулер, перелинковка, навигационный аудит.4---56# crawl4ai-seo78SEO-краулер для аудита сайтов и конкурентного анализа. Отвечает на вопрос: **"что реально лежит на страницах и как сайт устроен изнутри"**.910Не заменяет SERP-инструменты (позиции, видимость) — дополняет их данными о содержимом и структуре страниц.1112## Что умеет1314| Задача | Описание |15|--------|----------|16| **Site inventory** | Полная инвентаризация страниц: URL, status, title, H1, meta, canonical, word count |17| **On-page audit** | Поиск проблем: пустые title/H1, дубли заголовков, битые canonical, thin content |18| **Internal linking audit** | Граф внутренних ссылок, orphan pages (0 входящих), слабо связанные страницы |19| **Navigation audit** | Breadcrumbs, nav-блоки, menu consistency, hub-страницы без исходящих ссылок |20| **Landing comparison** | Сравнение shortlist URL по on-page сигналам (title, H1, content, links) |21| **Competitor research** | Прогон страниц конкурентов через тот же pipeline, сравнение шаблонов |2223## Config2425Глобальные defaults: `config/defaults.example.json`, локальный override — `config/defaults.json`.26Подробности: [config/README.md](config/README.md).2728Правило: в defaults **не** храним конкретный сайт или параметры клиента. Всё site-specific приходит через launch params и фиксируется в `cache/jobs/<job_id>/resolved_config.json`.2930## Workflow3132### Перед любым crawl33341. **Проверь окружение:**35 ```bash36 python3 scripts/doctor.py37 ```38 Если crawl4ai/playwright не готовы — остановись на seed/discovery, не имитируй crawl.39402. **Определи цель исследования:**41 - Полный аудит сайта → site inventory + navigation audit42 - Аудит лендингов → landing comparison43 - Анализ конкурентов → competitor research44 - Аудит перелинковки → internal linking audit45463. **Собери launch params:**47 - `target.domain` — домен исследования48 - `job.project` — проект/клиент49 - `job.label` — метка запуска5051### Основной pipeline5253```bash54# 1. Создать job55python3 scripts/init_job.py --domain https://example.com --project client-a --label full-audit5657# 2. Собрать seed URL из sitemap/robots58python3 scripts/seed_urls.py --job-id <job_id>5960# 3. Запустить crawl61uv run --script scripts/crawl_batch.py --job-id <job_id>6263# 4. Построить навигационный отчёт64python3 scripts/build_navigation_report.py \65 --seed-job-id <seed_job_id> \66 --crawl-job-id <crawl_job_id> \67 --report-dir reports/<project>/<label>6869# 5. Сравнить страницы70python3 scripts/compare_pages.py --job-id <job_id>71```7273### Быстрый вариант (без отдельного init)7475```bash76python3 scripts/seed_urls.py --domain https://example.com --project client-a --label quick-check77uv run --script scripts/crawl_batch.py --job-id <job_id>78```7980## Scripts8182| Script | Назначение |83|--------|-----------|84| `doctor.py` | Проверка окружения: uv, Python, crawl4ai, playwright, config |85| `init_job.py` | Создание job: `job_id`, `launch_params.json`, `resolved_config.json` |86| `seed_urls.py` | Discovery URL из sitemap/robots/файла → `seed.json` (работает без crawl4ai) |87| `crawl_batch.py` | Batch crawl через crawl4ai → `pages.ndjson`, `links.ndjson`, `summary.json` |88| `compare_pages.py` | Табличное сравнение crawled pages по on-page сигналам |89| `build_navigation_report.py` | Сводный навигационный аудит: orphans, weak hubs, breadcrumbs, menu drift |90| `common.py` | Shared helpers (не запускать напрямую) |9192## Extracted SEO Signals9394На каждую страницу (`pages.ndjson`) извлекаются:9596**On-page:** title, description, keywords, canonical, robots, og:title, og:description, og:image, H1, headings hierarchy, word count.9798**Navigation:** path depth, breadcrumbs (texts + URLs), nav blocks count, nav links count, nav URLs sample.99100**Links:** internal/external links count. В `links.ndjson` — полный граф: source → target, anchor text, nofollow, same_domain.101102## Navigation Audit Findings103104`build_navigation_report.py` автоматически находит:105106| Проблема | Что значит для SEO |107|----------|-------------------|108| **Orphan pages** (0 входящих ссылок) | Поисковик не найдёт страницу или не передаст ей вес |109| **Weakly linked** (1 входящая) | Страница получает минимум link equity |110| **Missing breadcrumbs** | Нет навигационной цепочки для бота и пользователя |111| **Breadcrumb inconsistency** | Разные trail signatures в одной секции — путаница в иерархии |112| **Weak nav template** | Hub-страница с подозрительно малым числом nav-ссылок |113| **Menu inconsistency** | Страницы теряют часть common nav targets (шаблон "дрейфует") |114| **Weak hubs** | Категория/раздел отдаёт <5 внутренних ссылок |115| **Duplicate titles** | Несколько страниц с одинаковым title — каннибализация |116| **Canonical mismatches** | canonical указывает не на себя |117| **Technical junk** | login-URL, php endpoints, asset-ссылки в навигационном слое |118| **Linked-not-seeded** | Сайт линкует URL, которых нет в sitemap |119120## Связка с другими скиллами121122| Сценарий | Скилл-партнёр | Порядок |123|----------|--------------|---------|124| SERP → on-page audit | `yandex-search-api` | Получи shortlist из SERP → прогони через crawl4ai |125| Organic landings → audit | `yandex-metrika` | Возьми top organic pages → проверь on-page quality |126| Индексация + audit | `yandex-webmaster` | Сравни indexed pages с crawled inventory |127| Anti-block fallback | `scrapedo-web-scraper` | При блокировке crawl4ai — fallback через Scrape.do |128129## Cache Layout130131```text132cache/jobs/<job_id>/133 launch_params.json # raw params этого запуска134 resolved_config.json # effective config после merge defaults + params135 manifest.json # operational state и artifact paths136 seed.json # seed URLs и метаданные discovery137 pages.ndjson # одна запись на страницу138 links.ndjson # одна запись на link edge139 summary.json # компактная сводка140 markdown/ # сохранённый markdown контент141```142143Каждый job изолирован. Параллельные запуски по разным сайтам безопасны.144145## Output Hygiene146147- stdout: только preview и пути к файлам.148- Полные данные: только в job files.149- Для анализа используй `rg`, `head`, `wc -l` по ndjson-файлам, не поднимай browser повторно.150151## References152153- [Workflow recipes and integration scenarios](references/WORKFLOWS.md)154- [Cache layout and output schema](references/OUTPUT_SCHEMA.md)