Проект аудита отелей: основные скрипты и документация
- Краулеры: 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
This commit is contained in:
129
estimate_time.py
Normal file
129
estimate_time.py
Normal file
@@ -0,0 +1,129 @@
|
||||
#!/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()
|
||||
|
||||
|
||||
|
||||
|
||||
Reference in New Issue
Block a user