- Краулеры: smart_crawler.py, regional_crawler.py - Аудит: audit_orel_to_excel.py, audit_chukotka_to_excel.py - РКН проверка: check_rkn_registry.py, recheck_unclear_rkn.py - Отчёты: create_orel_horizontal_report.py - Обработка: process_all_hotels_embeddings.py - Документация: README.md, DB_SCHEMA_REFERENCE.md
142 lines
4.4 KiB
Markdown
142 lines
4.4 KiB
Markdown
# 🔧 ОТЧЁТ ОБ ИСПРАВЛЕНИИ КРАУЛЕРА
|
||
|
||
**Дата:** 14 октября 2025, 14:30
|
||
**Проблема:** Ошибки при сохранении данных в БД
|
||
**Статус:** ✅ **ИСПРАВЛЕНО**
|
||
|
||
---
|
||
|
||
## 🐛 **НАЙДЕННЫЕ ОШИБКИ:**
|
||
|
||
### **Ошибка #1: Неверное имя колонки `raw_html`**
|
||
```
|
||
column "raw_html" of relation "hotel_website_raw" does not exist
|
||
```
|
||
|
||
**Причина:** Краулер использовал `raw_html`, а в таблице колонка называется `html`
|
||
|
||
**Исправление:**
|
||
```python
|
||
# ДО:
|
||
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)`
|
||
|
||
**Исправление:**
|
||
```sql
|
||
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. **Увеличить параллелизм:**
|
||
```python
|
||
MAX_CONCURRENT = 5 # Вместо 3
|
||
```
|
||
|
||
2. **Уменьшить количество страниц:**
|
||
```python
|
||
MAX_PAGES_PER_SITE = 10 # Вместо 15
|
||
```
|
||
|
||
3. **Уменьшить timeout:**
|
||
```python
|
||
PAGE_TIMEOUT = 20000 # Вместо 30000 (20 секунд)
|
||
```
|
||
|
||
4. **Добавить батчинг для БД:**
|
||
- Собирать данные в память
|
||
- Сохранять пачками по 50-100 страниц
|
||
|
||
---
|
||
|
||
## 📁 **ИЗМЕНЁННЫЕ ФАЙЛЫ:**
|
||
|
||
### **1. `mass_crawler.py`**
|
||
- Строка 205: `raw_html` → `html`
|
||
- Строка 205: `http_status` → `status_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
|
||
|
||
|
||
|
||
|
||
|