Files
hotels/generate_csv_debug.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

216 lines
8.5 KiB
Python
Raw Permalink 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
"""
CSV генератор для проверки сырых данных
"""
import psycopg2
import json
import csv
from urllib.parse import unquote
from datetime import datetime
# Конфигурация БД
DB_CONFIG = {
'host': '147.45.189.234',
'port': 5432,
'database': 'default_db',
'user': 'gen_user',
'password': unquote('2~~9_%5EkVsU%3F2%5CS')
}
def get_audit_results_from_db():
"""Получить результаты аудита из БД"""
try:
conn = psycopg2.connect(**DB_CONFIG)
cursor = conn.cursor()
cursor.execute("""
SELECT
ar.hotel_id,
hm.full_name,
hm.website_address,
hm.rkn_registry_status,
hm.rkn_registry_number,
hm.rkn_registry_date,
ar.score_percentage,
ar.criteria_results,
hm.created_at
FROM hotel_audit_results ar
JOIN hotel_main hm ON ar.hotel_id = hm.id
WHERE hm.region_name = 'Чукотский автономный округ'
ORDER BY hm.created_at DESC
""")
results = []
for row in cursor.fetchall():
# Конвертируем в словарь
result = {
'hotel_id': row[0],
'full_name': row[1],
'website_address': row[2],
'rkn_registry_status': row[3],
'rkn_registry_number': row[4],
'rkn_registry_date': row[5],
'score_percentage': row[6],
'criteria_results': row[7],
'created_at': row[8]
}
results.append(result)
cursor.close()
conn.close()
return results
except Exception as e:
print(f"❌ Ошибка получения данных: {e}")
return []
def create_csv_report(results):
"""Создать CSV отчёт"""
timestamp = datetime.now().strftime("%Y%m%d_%H%M%S")
filename = f"audit_debug_{timestamp}.csv"
with open(filename, 'w', newline='', encoding='utf-8') as csvfile:
writer = csv.writer(csvfile)
# Заголовки
headers = [
'ID отеля', 'Название отеля', 'Сайт', 'Балл (%)', 'Дата аудита',
'РКН статус', 'РКН номер', 'РКН дата'
]
# Добавляем заголовки критериев
if results and results[0]['criteria_results']:
criteria_results = results[0]['criteria_results']
if isinstance(criteria_results, str):
criteria_results = json.loads(criteria_results)
if isinstance(criteria_results, list):
for criterion_idx, criterion in enumerate(criteria_results):
# Пропускаем критерий 6 (РКН) - он будет отдельно
if criterion_idx == 5: # индекс 5 = критерий 6
continue
criterion_name = f"Критерий_{criterion_idx+1}"
headers.extend([
f"{criterion_name}_Статус",
f"{criterion_name}_URL",
f"{criterion_name}_Комментарий"
])
# Добавляем РКН колонки
headers.extend(['РКН_Реестр', 'РКН_Номерата', 'РКН_Ссылка'])
writer.writerow(headers)
# Данные
for result in results:
row = [
result['hotel_id'],
result['full_name'],
result['website_address'] or '-',
result['score_percentage'],
str(result['created_at'])[:10]
]
# РКН данные из hotel_main
rkn_status = result.get('rkn_registry_status', '')
rkn_in_registry = "ДА" if rkn_status and rkn_status.lower() == 'found' else "НЕТ"
rkn_number = result.get('rkn_registry_number', '')
rkn_date = result.get('rkn_registry_date', '')
rkn_info_text = f"{rkn_number}\n{rkn_date}" if rkn_number or rkn_date else "-"
rkn_url = f"https://rkn.gov.ru/mass-communications/reestr/search/?q={rkn_number}" if rkn_number else "-"
row.extend([rkn_in_registry, rkn_info_text, rkn_url])
# Данные критериев
criteria_results = result['criteria_results']
if isinstance(criteria_results, str):
criteria_results = json.loads(criteria_results)
if isinstance(criteria_results, list):
for criterion_idx, criterion in enumerate(criteria_results):
# Пропускаем критерий 6 (РКН) - он будет отдельно
if criterion_idx == 5:
continue
# Статус
status = "ДА" if criterion.get('found') else "НЕТ"
# URL
url = '-'
if criterion.get('ai_agent', {}).get('url'):
url = criterion['ai_agent']['url']
# Комментарий
comment = "Не найдено"
if criterion.get('found'):
if criterion.get('ai_agent', {}).get('details'):
comment = criterion['ai_agent']['details']
elif criterion.get('ai_agent', {}).get('quote'):
comment = criterion['ai_agent']['quote']
elif criterion.get('regex', {}).get('extracted'):
comment = criterion['regex']['extracted']
row.extend([status, url, comment])
writer.writerow(row)
return filename
def main():
"""Основная функция"""
print("🚀 ГЕНЕРАЦИЯ CSV ДЛЯ ДЕБАГА")
print("=" * 40)
try:
# Получаем данные
print("📡 Подключаюсь к БД...")
results = get_audit_results_from_db()
if not results:
print("❌ Нет данных для отчёта")
return
print(f"✅ Получено результатов: {len(results)}")
# Выводим сырые данные первого отеля
if results:
print("\n🔍 СЫРЫЕ ДАННЫЕ ПЕРВОГО ОТЕЛЯ:")
print(f"ID: {results[0]['hotel_id']}")
print(f"Название: {results[0]['full_name']}")
print(f"Сайт: {results[0]['website_address']}")
print(f"РКН статус: {results[0]['rkn_registry_status']}")
print(f"РКН номер: {results[0]['rkn_registry_number']}")
print(f"РКН дата: {results[0]['rkn_registry_date']}")
print(f"Балл: {results[0]['score_percentage']}")
criteria_results = results[0]['criteria_results']
if isinstance(criteria_results, str):
criteria_results = json.loads(criteria_results)
print(f"\n📊 КРИТЕРИИ ({len(criteria_results)} шт.):")
for i, criterion in enumerate(criteria_results):
if isinstance(criterion, dict):
print(f" {i+1}. {criterion.get('criterion_name', f'Критерий {i+1}')}: {criterion.get('found', False)}")
else:
print(f" {i+1}. {criterion} (тип: {type(criterion)})")
# Создаём CSV
filename = create_csv_report(results)
print(f"\n✅ CSV файл сохранён: {filename}")
print(f"📊 Обработано отелей: {len(results)}")
if results:
avg_score = sum(r['score_percentage'] for r in results) / len(results)
print(f"📈 Средний % соответствия: {avg_score:.1f}%")
except Exception as e:
print(f"❌ Ошибка: {e}")
import traceback
traceback.print_exc()
if __name__ == "__main__":
main()