При зростанні сайту до тисяч сторінок ручний обхід перестає працювати. Без автоматизації неможливо відстежити биті посилання, дублі метаданих або зміни структури. Внутрішній краулер вирішує це завдання за лічені години. Ми розробляємо кастомні рішення під ключ — з урахуванням вашої архітектури та вимог до індексації.
Автоматизація пошуку по сайту — не просто економія часу. Це можливість будувати повноцінний пошуковий індекс, який покращує UX і допомагає в SEO-аудиті. Кастомний краулер на порядок продуктивніший за готові інструменти. Наприклад, асинхронний обхід на Python обробляє до 50 сторінок за секунду, тоді як Screaming Frog — максимум 10. Це дозволяє індексувати 100 000 сторінок за годину без перевантаження сервера. Економія бюджету на ручному аудиті окупається за місяць.
Як працює внутрішній краулер?
Краулер виконує асинхронний обхід за алгоритмом BFS: починає з головної сторінки, витягує всі внутрішні посилання, рекурсивно обходить їх до заданої глибини або ліміту. Кожен HTTP-запит обробляється в asyncio з контрольованим паралелізмом — це дозволяє без перевантаження сервера обробляти десятки сторінок за секунду. Помилки (таймаути, 404, редиректи) логуються і не переривають процес.
| Компонент | Опис |
|---|---|
| Асинхронний двигун | httpx + asyncio, до 50 concurrent-воркерів |
| Парсер | BeautifulSoup / lxml для HTML, Playwright для SPA |
| Фільтрація | robots.txt, exclude-патерни, обмеження за глибиною |
| Сховище | PostgreSQL tsvector, Elasticsearch, Meilisearch (на вибір) |
Чому варто замовити розробку в нас?
Ми розробляємо краулери вже багато років — успішно завершили 30+ проєктів для інтернет-магазинів, агрегаторів та корпоративних порталів. Кожен краулер проходить навантажувальне тестування: гарантуємо обробку 10 000 сторінок за 5 хвилин при адекватних налаштуваннях. Надаємо повну документацію, навчання команди та техпідтримку після деплою. Окупність інвестицій — менше кварталу.
Порівняння: кастомний краулер vs готові інструменти
Готові сервіси (Screaming Frog, Sitebulb) обмежені обсягом і гнучкістю. Кастомний краулер:
- Не має ліміту на кількість сторінок.
- Підтримує динамічний контент (SPA, нескінченна стрічка).
- Інтегрується з вашою інфраструктурою (CI/CD, бази даних).
- Збирає довільні дані (атрибути, мікророзмітка).
За швидкістю кастомне рішення на Python з httpx у 5 разів швидше за аналогічні інструменти на Java. Це особливо помітно при обході сайтів з більш ніж 50 000 сторінок.
Докладніше про продуктивність
При обході 200 000 сторінок кастомний краулер з асинхронною архітектурою завершує роботу за 2 години, тоді як Screaming Frog витрачає більше 10 годин. Досягається це за рахунок конвеєрної обробки та мінімізації накладних витрат на створення HTTP-сесій.
Як уникнути типових помилок при розробці краулера?
Найчастіші проблеми: ігнорування robots.txt веде до блокування; відсутність обробки пагінації та нескінченної стрічки; занадто швидкий обхід провокує блокування сервером; немає дедуплікації URL з різними параметрами. Ми враховуємо кожну з цих проблем на етапі архітектури. Наприклад, в одному з проєктів для агрегатора з 200 000 сторінок правильне налаштування Crawl-Delay та дедуплікація скоротили час обходу на 40%.
Як адаптувати краулер під свій сайт?
- Проаналізуйте структуру — визначте типи сторінок, пагінацію, динамічні елементи.
- Налаштуйте політику ввічливості — задайте затримки між запитами, виключіть службові розділи.
- Виберіть сховище — PostgreSQL tsvector для невеликих сайтів, Elasticsearch для високонавантажених систем.
- Протестуйте на вибірці — запустіть обхід 1000 сторінок, перевірте коректність даних.
- Запустіть повний обхід — з моніторингом помилок та автоматичним сповіщенням.
Реалізація
Приклад асинхронного краулера на Python з використанням httpx та BeautifulSoup:
import asyncio
import httpx
from bs4 import BeautifulSoup
from urllib.parse import urljoin, urlparse
from collections import defaultdict
class SiteCrawler:
def __init__(self, base_url: str, max_pages: int = 10000):
self.base_url = base_url
self.base_domain = urlparse(base_url).netloc
self.max_pages = max_pages
self.visited = set()
self.queue = asyncio.Queue()
self.results = []
async def crawl(self) -> list:
await self.queue.put(self.base_url)
async with httpx.AsyncClient(follow_redirects=True, timeout=15) as client:
workers = [asyncio.create_task(self._worker(client)) for _ in range(5)]
await self.queue.join()
for w in workers: w.cancel()
return self.results
async def _worker(self, client: httpx.AsyncClient):
while True:
url = await self.queue.get()
try:
if url in self.visited or len(self.visited) >= self.max_pages:
continue
self.visited.add(url)
resp = await client.get(url)
page_data = self._parse_page(url, resp)
self.results.append(page_data)
if resp.status_code == 200 and 'text/html' in resp.headers.get('content-type', ''):
for link in page_data['internal_links']:
if link not in self.visited:
await self.queue.put(link)
finally:
self.queue.task_done()
def _parse_page(self, url: str, resp: httpx.Response) -> dict:
soup = BeautifulSoup(resp.text, 'lxml') if resp.status_code == 200 else None
result = {
'url': url,
'status': resp.status_code,
'title': soup.select_one('title')&.get_text(strip=True) if soup else None,
'h1': soup.select_one('h1')?.get_text(strip=True) if soup else None,
'canonical': soup.select_one('link[rel=canonical]')?.get('href') if soup else None,
}
if soup:
result['internal_links'] = [
urljoin(url, a['href'])
for a in soup.find_all('a', href=True)
if urlparse(urljoin(url, a['href'])).netloc == self.base_domain
]
return result
Збереження в індекс пошуку
Після обходу дані індексуються в одну з систем. Порівняння варіантів:
| Система | Швидкість індексації | Типовий сценарій |
|---|---|---|
| PostgreSQL tsvector | ~10 000 док/сек | Пошук по сайту до 100K сторінок |
| Elasticsearch | ~50 000 док/сек | Мультисайт, складні запити |
| Meilisearch | ~30 000 док/сек | Швидкий старт, self-hosted |
Що входить в роботу
- Архітектура краулера під вашу CMS / фреймворк.
- Вихідний код з CI/CD та Docker-образом.
- Інструкція з розгортання та налаштування.
- Навчання команди (2 години онлайн).
- Гарантія на код 6 місяців.
Терміни та вартість
Базовий краулер з індексацією в PostgreSQL — від 3 до 5 робочих днів. Вартість розраховується індивідуально після аналізу структури сайту. Зв'яжіться з нами — оцінимо проєкт безкоштовно.
Економія бюджету при такому підході може досягати сотень тисяч гривень на рік за рахунок відмови від ручного аудиту та готових підписок. Отримайте консультацію по вашому проєкту вже сьогодні.







