Files
polit-scraper/monitor.py

71 lines
2.5 KiB
Python

import sqlite3
import os
import time
from datetime import datetime
# Wir suchen die DB im selben Ordner wie das Skript
DB_PATH = os.path.join(os.path.dirname(__file__), "polit_scraper.db")
def get_stats():
try:
conn = sqlite3.connect(DB_PATH)
cursor = conn.cursor()
# Statistiken
cursor.execute("SELECT status, count(*) FROM analysis_queue GROUP BY status")
stats = dict(cursor.fetchall())
# Laufende Jobs (PROCESSING)
cursor.execute("SELECT id, url, worker_id, last_update FROM analysis_queue WHERE status='PROCESSING' ORDER BY last_update DESC")
processing = cursor.fetchall()
# Letzte 10 Einträge (allgemein)
cursor.execute("SELECT id, status, url, created_at FROM analysis_queue ORDER BY id DESC LIMIT 10")
recent = cursor.fetchall()
conn.close()
return stats, processing, recent
except Exception as e:
return {}, [], []
def main():
while True:
try:
stats, processing, recent = get_stats()
os.system('clear')
print(f"--- Polit-Scraper Live Monitor --- {datetime.now().strftime('%H:%M:%S')}")
print("-" * 80)
# Stats Anzeige
all_statuses = ['PENDING', 'PROCESSING', 'ANALYZED', 'COMPLETED', 'FAILED']
stat_line = " | ".join([f"{s}: {stats.get(s, 0)}" for s in all_statuses])
print(stat_line)
print("-" * 80)
# PROCESSING Jobs (aktiv)
print(f"{'AKTIV (PROCESSING)':<80}")
print(f"{'ID':<4} | {'Worker':<8} | {'URL (Beginn)'}")
print("-" * 80)
for r_id, url, worker_id, ts in processing:
url_display = (url[:60] + '..') if len(url) > 60 else url
print(f"{r_id:<4} | {str(worker_id):<8} | {url_display}")
print("-" * 80)
# LETZTE 10 Jobs
print(f"{'LETZTE 10 JOB-STATUS':<80}")
print(f"{'ID':<4} | {'Status':<11} | {'URL (Ende)'}")
print("-" * 80)
for r_id, status, url, ts in recent:
url_display = (url[:60] + '..') if len(url) > 60 else url
print(f"{r_id:<4} | {status:<11} | {url_display}")
time.sleep(2)
except KeyboardInterrupt:
break
except Exception as e:
print(f"Fehler: {e}")
time.sleep(5)
if __name__ == "__main__":
main()