Skip to content

LigeronAhill/webcrawler

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

6 Commits
 
 
 
 
 
 
 
 
 
 

Repository files navigation

🕷️ WebCrawler - веб-краулер на Rust

Многопоточный веб-краулер с TUI интерфейсом для обхода веб-сайтов и сохранения результатов в SQLite базу данных.

✨ Возможности

  • 🎨 TUI интерфейс - удобный терминальный интерфейс для ввода параметров
  • 🚀 Многопоточность - параллельная обработка страниц с помощью пула потоков
  • 💾 Сохранение в SQLite - автоматическое сохранение результатов в базу данных
  • 🔍 Парсинг ссылок - извлечение всех внутренних ссылок на странице
  • 📊 Метрики - время загрузки, статус ответа, длина текста
  • 🛡️ Безопасность - защита от бесконечных циклов и повторных посещений

📋 Требования

  • Rust 1.70+
  • SQLite3 (встроенный через rusqlite)

🚀 Установка

Из исходного кода

# Клонирование репозитория
git clone https://github.com/LigeronAhill/webcrawler.git
cd webcrawler

# Сборка проекта
cargo build --release

# Запуск
./target/release/webcrawler

Cargo run

cargo run --release

📖 Использование

TUI Интерфейс

  1. Запустите программу
  2. Введите URL для обхода (например, https://example.com)
  3. Укажите максимальную глубину обхода (0-255)
  4. Нажмите Enter для запуска
  5. Нажмите Esc для отмены

Управление в TUI

Клавиша Действие
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: 1

📊 Формат данных

Структура PageResult

pub struct PageResult {
    pub url: String,      // URL страницы
    pub title: String,    // Заголовок страницы
    pub text_len: u64,    // Длина текста
    pub elapsed: u128,    // Время загрузки (мс)
    pub status: u16,      // HTTP статус
}

База данных SQLite

Таблица 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")

🛠️ Технические детали

Компоненты

  1. TUI (app.rs) - терминальный интерфейс на ratatui
  2. ThreadPool (pool.rs) - пул потоков для параллельной обработки
  3. Crawler (crawler.rs) - основная логика обхода
  4. 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 парсинг

⚠️ Внимание: Уважайте robots.txt и не перегружайте серверы. Используйте ответственно!


Этот README.md содержит:
- Описание проекта и его возможностей
- Инструкции по установке и использованию
- Архитектуру и технические детали
- Примеры и советы по решению проблем
- Планы развития и информацию для контрибьюторов

About

No description, website, or topics provided.

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

 
 
 

Contributors

Languages