Files
hotels/estimate_time.py
Фёдор 0cf3297290 Проект аудита отелей: основные скрипты и документация
- Краулеры: 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
2025-10-16 10:52:09 +03:00

130 lines
4.4 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#!/usr/bin/env python3
"""
Оценка времени работы краулера
"""
from urllib.parse import unquote
import psycopg2
from datetime import datetime, timedelta
conn = psycopg2.connect(
host='147.45.189.234',
database='default_db',
user='gen_user',
password=unquote('2~~9_%5EkVsU%3F2%5CS')
)
cur = conn.cursor()
# Общая статистика
cur.execute('SELECT COUNT(*) FROM hotel_main WHERE website_address IS NOT NULL')
total_hotels_with_sites = cur.fetchone()[0]
cur.execute('SELECT COUNT(DISTINCT hotel_id) FROM hotel_website_processed')
processed_hotels = cur.fetchone()[0]
# Осталось обработать
remaining = total_hotels_with_sites - processed_hotels
# Статистика за последние 24 часа
cur.execute("""
SELECT COUNT(DISTINCT hotel_id)
FROM hotel_website_processed
WHERE processed_at > NOW() - INTERVAL '24 hours'
""")
hotels_per_day = cur.fetchone()[0]
# Статистика за последний час
cur.execute("""
SELECT COUNT(DISTINCT hotel_id)
FROM hotel_website_processed
WHERE processed_at > NOW() - INTERVAL '1 hour'
""")
hotels_per_hour = cur.fetchone()[0]
# Время первого и последнего краулинга
cur.execute("""
SELECT MIN(processed_at), MAX(processed_at)
FROM hotel_website_processed
""")
first_date, last_date = cur.fetchone()
# Расчёт скорости
if first_date and last_date:
elapsed_time = (last_date - first_date).total_seconds() / 3600 # в часах
if elapsed_time > 0:
avg_hotels_per_hour = processed_hotels / elapsed_time
else:
avg_hotels_per_hour = hotels_per_hour
else:
avg_hotels_per_hour = hotels_per_hour
# Оценки времени
if hotels_per_hour > 0:
hours_left_current = remaining / hotels_per_hour
days_left_current = hours_left_current / 24
hours_left_avg = remaining / avg_hotels_per_hour if avg_hotels_per_hour > 0 else 0
days_left_avg = hours_left_avg / 24
eta_current = datetime.now() + timedelta(hours=hours_left_current)
eta_avg = datetime.now() + timedelta(hours=hours_left_avg)
else:
hours_left_current = 0
days_left_current = 0
hours_left_avg = 0
days_left_avg = 0
eta_current = None
eta_avg = None
print("📊 ОЦЕНКА ВРЕМЕНИ РАБОТЫ КРАУЛЕРА")
print("=" * 60)
print(f"\n🏨 ВСЕГО:")
print(f" Отелей с сайтами: {total_hotels_with_sites:,}")
print(f" Обработано: {processed_hotels:,} ({processed_hotels/total_hotels_with_sites*100:.1f}%)")
print(f" Осталось: {remaining:,}")
print(f"\nСКОРОСТЬ:")
print(f" За последний час: {hotels_per_hour} отелей/час")
print(f" За последние 24ч: {hotels_per_day} отелей/день")
if avg_hotels_per_hour > 0:
print(f" Средняя с начала: {avg_hotels_per_hour:.1f} отелей/час")
if first_date:
print(f"\n📅 ПЕРИОД:")
print(f" Начало: {first_date.strftime('%Y-%m-%d %H:%M')}")
print(f" Сейчас: {last_date.strftime('%Y-%m-%d %H:%M')}")
print(f" Прошло: {elapsed_time:.1f} часов ({elapsed_time/24:.1f} дней)")
print(f"\n⏱️ ОЦЕНКА ВРЕМЕНИ (по текущей скорости {hotels_per_hour} отелей/час):")
if eta_current:
print(f" Осталось времени: {hours_left_current:.1f} часов ({days_left_current:.1f} дней)")
print(f" Завершение: {eta_current.strftime('%Y-%m-%d %H:%M')}")
else:
print(" Недостаточно данных")
if avg_hotels_per_hour > 0:
print(f"\n⏱️ ОЦЕНКА ВРЕМЕНИ (по средней скорости {avg_hotels_per_hour:.1f} отелей/час):")
print(f" Осталось времени: {hours_left_avg:.1f} часов ({days_left_avg:.1f} дней)")
if eta_avg:
print(f" Завершение: {eta_avg.strftime('%Y-%m-%d %H:%M')}")
# Средние страниц на отель
cur.execute("""
SELECT AVG(page_count)::numeric(10,1)
FROM (
SELECT hotel_id, COUNT(*) as page_count
FROM hotel_website_processed
GROUP BY hotel_id
) sub
""")
avg_pages = cur.fetchone()[0]
print(f"\n📄 СТАТИСТИКА СТРАНИЦ:")
print(f" Среднее страниц на отель: {avg_pages}")
cur.close()
conn.close()