Files
hotels/CRAWLER_FIX_REPORT.md
Фёдор 684fada337 🚀 Full project sync: Hotels RAG & Audit System
 Major Features:
- Complete RAG system for hotel website analysis
- Hybrid audit with BGE-M3 embeddings + Natasha NER
- Universal horizontal Excel reports with dashboards
- Multi-region processing (SPb, Orel, Chukotka, Kamchatka)

📊 Completed Regions:
- Орловская область: 100% (36/36)
- Чукотский АО: 100% (4/4)
- г. Санкт-Петербург: 93% (893/960)
- Камчатский край: 87% (89/102)

🔧 Infrastructure:
- PostgreSQL with pgvector extension
- BGE-M3 embeddings API
- Browserless for web scraping
- N8N workflows for automation
- S3/Nextcloud file storage

📝 Documentation:
- Complete DB schemas
- API documentation
- Setup guides
- Status reports
2025-10-27 22:49:42 +03:00

4.4 KiB
Raw Blame History

🔧 ОТЧЁТ ОБ ИСПРАВЛЕНИИ КРАУЛЕРА

Дата: 14 октября 2025, 14:30
Проблема: Ошибки при сохранении данных в БД
Статус: ИСПРАВЛЕНО


🐛 НАЙДЕННЫЕ ОШИБКИ:

Ошибка #1: Неверное имя колонки raw_html

column "raw_html" of relation "hotel_website_raw" does not exist

Причина: Краулер использовал raw_html, а в таблице колонка называется html

Исправление:

# ДО:
INSERT INTO hotel_website_raw (hotel_id, url, raw_html, http_status, crawled_at)

# ПОСЛЕ:
INSERT INTO hotel_website_raw (hotel_id, url, html, status_code, crawled_at)

Ошибка #2: Неверное имя колонки http_status

column "http_status" of relation "hotel_website_raw" does not exist

Причина: Краулер использовал http_status, а в таблице колонка называется status_code

Исправление: Заменено на status_code (уже исправлено в #1)


Ошибка #3: Отсутствие уникального индекса

there is no unique or exclusion constraint matching the ON CONFLICT specification

Причина: В таблице hotel_website_processed не было уникального ограничения на (hotel_id, url)

Исправление:

CREATE UNIQUE INDEX IF NOT EXISTS hotel_website_processed_hotel_id_url_idx 
ON hotel_website_processed (hotel_id, url)

РЕЗУЛЬТАТЫ ПОСЛЕ ИСПРАВЛЕНИЯ:

Тестирование (14:28):

  • Нет ошибок в логе
  • Данные сохраняются в hotel_website_raw
  • Данные сохраняются в hotel_website_processed
  • Краулер обрабатывает по ~140 отелей/час

Пример свежих данных:

База отдыха "Алтай-Rest" (Алтайский край) - 1 страница
База отдыха E.L.K.I. (Алтайский край) - 1 страница
Апарт-отель «Лофт Апарт» (Алтайский край) - 8 страниц
Апарт-отель «Бочкари 1825» (Алтайский край) - 7 страниц
Апарт-Парк "ШАЛЕИРИ" (Алтайский край) - 1 страница

📊 СТАТИСТИКА:

База отелей:

  • 🏨 Всего отелей: 33,773
  • 🌐 С сайтами: 18,594 (55.1%)
  • Без сайтов: 15,179 (44.9%)

Прогресс краулинга:

  • Обработано: ~930 отелей
  • Осталось: ~17,664 отелей
  • 📊 Прогресс: 5.0%
  • ⏱️ Ожидаемое время: ~126 часов (~5 дней)

🚀 РЕКОМЕНДАЦИИ ДЛЯ УСКОРЕНИЯ:

  1. Увеличить параллелизм:

    MAX_CONCURRENT = 5  # Вместо 3
    
  2. Уменьшить количество страниц:

    MAX_PAGES_PER_SITE = 10  # Вместо 15
    
  3. Уменьшить timeout:

    PAGE_TIMEOUT = 20000  # Вместо 30000 (20 секунд)
    
  4. Добавить батчинг для БД:

    • Собирать данные в память
    • Сохранять пачками по 50-100 страниц

📁 ИЗМЕНЁННЫЕ ФАЙЛЫ:

1. mass_crawler.py

  • Строка 205: raw_htmlhtml
  • Строка 205: http_statusstatus_code
  • Строка 207: Добавлен ON CONSTRAINT для hotel_website_raw
  • Строка 218: Добавлен уникальный индекс для hotel_website_processed

2. База данных:

  • Создан индекс: hotel_website_processed_hotel_id_url_idx

🎯 ТЕКУЩИЙ СТАТУС:

Краулер работает стабильно
Ошибок нет
Данные сохраняются корректно
PID: 1593850
Лог: mass_crawler_output.log


Автор: AI Assistant + Фёдор
Дата создания: 14 октября 2025