Многопоточный веб-краулер с TUI интерфейсом для обхода веб-сайтов и сохранения результатов в SQLite базу данных.
- 🎨 TUI интерфейс - удобный терминальный интерфейс для ввода параметров
- 🚀 Многопоточность - параллельная обработка страниц с помощью пула потоков
- 💾 Сохранение в SQLite - автоматическое сохранение результатов в базу данных
- 🔍 Парсинг ссылок - извлечение всех внутренних ссылок на странице
- 📊 Метрики - время загрузки, статус ответа, длина текста
- 🛡️ Безопасность - защита от бесконечных циклов и повторных посещений
- Rust 1.70+
- SQLite3 (встроенный через rusqlite)
# Клонирование репозитория
git clone https://github.com/LigeronAhill/webcrawler.git
cd webcrawler
# Сборка проекта
cargo build --release
# Запуск
./target/release/webcrawlercargo run --release- Запустите программу
- Введите URL для обхода (например,
https://example.com) - Укажите максимальную глубину обхода (0-255)
- Нажмите
Enterдля запуска - Нажмите
Escдля отмены
| Клавиша | Действие |
|---|---|
Tab |
Переключение между полями |
Enter |
Запуск краулера |
Esc |
Отмена и выход |
0-9 |
Ввод глубины (в поле Max depth) |
↑/k |
Увеличение глубины |
↓/j |
Уменьшение глубины |
Backspace |
Удаление символа |
# Обход сайта example.com на глубину 2
URL: https://example.com
Depth: 2
# Обход docs.rs на глубину 1
URL: https://docs.rs
Depth: 1pub struct PageResult {
pub url: String, // URL страницы
pub title: String, // Заголовок страницы
pub text_len: u64, // Длина текста
pub elapsed: u128, // Время загрузки (мс)
pub status: u16, // HTTP статус
}Таблица page_results:
CREATE TABLE page_results (
id INTEGER PRIMARY KEY AUTOINCREMENT,
url TEXT NOT NULL UNIQUE,
title TEXT NOT NULL,
text_len INTEGER NOT NULL,
elapsed INTEGER NOT NULL,
status INTEGER NOT NULL,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
-- Индексы
CREATE INDEX idx_page_results_url ON page_results(url);
CREATE INDEX idx_page_results_status ON page_results(status);
CREATE INDEX idx_page_results_created_at ON page_results(created_at);- User-Agent:
Ratacrawler/0.1 - Таймаут: 10 секунд
- Количество потоков: количество ядер CPU
- База данных:
./webcrawler.db - Максимальная глубина: задается пользователем (0-255)
В main.rs можно изменить:
// Изменение таймаута
.timeout(Duration::from_secs(30))
// Изменение User-Agent
.user_agent("MyCustomCrawler/1.0")- TUI (app.rs) - терминальный интерфейс на ratatui
- ThreadPool (pool.rs) - пул потоков для параллельной обработки
- Crawler (crawler.rs) - основная логика обхода
- Storage (storage.rs) - работа с SQLite базой данных
Arc<Mutex<HashSet<String>>>для отслеживания посещенных URL- Каналы
mpscдля передачи результатов
- Автоматический пропуск недоступных страниц
- Продолжение работы при ошибках парсинга
- Graceful shutdown при закрытии каналов
# Запуск с маленьким сайтом для теста
cargo run
# Введите: https://example.com
# Глубина: 1
# Проверка базы данных
sqlite3 webcrawler.db "SELECT COUNT(*), MIN(elapsed), MAX(elapsed) FROM page_results;"- Скорость: до 100+ страниц в секунду (зависит от сети)
- Память: ~50-100MB для обхода 10000 страниц
- Потоки: автоматическая настройка под количество ядер CPU
// В конце main.rs добавьте:
std::process::exit(0);- Проверьте фильтрацию
!link.contains("?")- отключает параметры в URL - Увеличьте
max_depth - Проверьте
same_hostфункцию для поддоменов
- Уменьшите количество потоков
- Увеличьте таймаут для медленных сайтов
- Добавьте задержки между запросами
- Добавить progress bar в TUI
- Поддержка robots.txt
- Ограничение скорости запросов (rate limiting)
- Экспорт в JSON/CSV
- Поддержка HTTPS с проверкой сертификатов
- Resume прерванных обходов
- Фильтрация по типам файлов
- Поддержка cookies и сессий
MIT License
- ratatui - за отличный TUI фреймворк
- reqwest - за HTTP клиент
- rusqlite - за обертку SQLite
- scraper - за HTML парсинг
Этот README.md содержит:
- Описание проекта и его возможностей
- Инструкции по установке и использованию
- Архитектуру и технические детали
- Примеры и советы по решению проблем
- Планы развития и информацию для контрибьюторов