2025-10-16 10:52:09 +03:00
|
|
|
|
# 🔧 ОТЧЁТ ОБ ИСПРАВЛЕНИИ КРАУЛЕРА
|
|
|
|
|
|
|
|
|
|
|
|
**Дата:** 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
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
2025-10-27 22:49:42 +03:00
|
|
|
|
|