This commit is contained in:
2025-04-22 06:31:38 +00:00
parent 5ddd8ee065
commit 80ae56bf9f

View File

@@ -319,7 +319,7 @@ def process_find_wiki_with_serp(sheet_handler, row_limit=None, min_employees=500
"""
Sucht fehlende Wikipedia-URLs (Spalte M = k.A.) für Unternehmen mit > min_employees
über SerpAPI und trägt gefundene URLs in Spalte M ein. Setzt ReEval-Flag (A)
und löscht Timestamps (AN, AO) für gefundene Einträge.
und löscht abhängige Wiki-Spalten (N-V, AN, AO, AP, AX).
Merkt sich in Spalte AY, wann die Suche durchgeführt wurde.
Args:
@@ -337,16 +337,27 @@ def process_find_wiki_with_serp(sheet_handler, row_limit=None, min_employees=500
header_rows = 5
data_rows = all_data[header_rows:]
# Benötigte Spaltenindizes holen (inkl. neuer Spalte AY)
# Benötigte Spaltenindizes holen (inkl. aller zu löschenden Spalten)
try:
col_indices = {
"A": COLUMN_MAP["ReEval Flag"],
"K": COLUMN_MAP["CRM Anzahl Mitarbeiter"],
"M": COLUMN_MAP["Wiki URL"],
"B": COLUMN_MAP["CRM Name"],
"N": COLUMN_MAP["Wiki Absatz"], # NEU zum Löschen
"O": COLUMN_MAP["Wiki Branche"], # NEU zum Löschen
"P": COLUMN_MAP["Wiki Umsatz"], # NEU zum Löschen
"Q": COLUMN_MAP["Wiki Mitarbeiter"], # NEU zum Löschen
"R": COLUMN_MAP["Wiki Kategorien"], # NEU zum Löschen
"S": COLUMN_MAP["Chat Wiki Konsistenzprüfung"], # NEU zum Löschen
"T": COLUMN_MAP["Chat Begründung Wiki Inkonsistenz"], # NEU zum Löschen
"U": COLUMN_MAP["Chat Vorschlag Wiki Artikel"], # NEU zum Löschen
"V": COLUMN_MAP["Begründung bei Abweichung"], # NEU zum Löschen
"AN": COLUMN_MAP["Wikipedia Timestamp"],
"AO": COLUMN_MAP["Timestamp letzte Prüfung"],
"AY": COLUMN_MAP["SerpAPI Wiki Search Timestamp"] # <-- NEU
"AP": COLUMN_MAP["Version"], # NEU zum Löschen
"AX": COLUMN_MAP["Wiki Verif. Timestamp"], # NEU zum Löschen
"AY": COLUMN_MAP["SerpAPI Wiki Search Timestamp"]
}
col_letters = {key: sheet_handler._get_col_letter(idx + 1) for key, idx in col_indices.items()}
except KeyError as e:
@@ -356,14 +367,13 @@ def process_find_wiki_with_serp(sheet_handler, row_limit=None, min_employees=500
logging.critical(f"FEHLER beim Holen der Spaltenbuchstaben: {e}")
return
# --- HIER WIRD all_sheet_updates definiert ---
all_sheet_updates = []
processed_rows = 0 # Zählt Zeilen, für die eine Suche durchgeführt wurde
found_urls = 0 # Zählt Zeilen, wo eine URL gefunden wurde
skipped_timestamp_ay = 0 # Zählt Zeilen, die übersprungen wurden, weil AY gesetzt war
processed_rows = 0
found_urls = 0
skipped_timestamp_ay = 0
skipped_employee_count = 0
skipped_m_filled_count = 0
now_timestamp_str = datetime.now().strftime("%Y-%m-%d %H:%M:%S") # Einmaliger Timestamp für diesen Lauf
now_timestamp_str = datetime.now().strftime("%Y-%m-%d %H:%M:%S")
for idx, row in enumerate(data_rows):
row_num_in_sheet = idx + header_rows + 1
@@ -372,18 +382,14 @@ def process_find_wiki_with_serp(sheet_handler, row_limit=None, min_employees=500
logging.info(f"Zeilenlimit ({row_limit}) für durchgeführte Suchen erreicht.")
break
# --- NEUE PRÜFUNG: Wurde diese Zeile schon via SerpAPI geprüft? ---
# Prüfe AY Timestamp
ts_ay_val = row[col_indices["AY"]] if len(row) > col_indices["AY"] else ""
if ts_ay_val and ts_ay_val.strip():
skipped_timestamp_ay += 1
# Optional: Debug Log
# logging.debug(f"Zeile {row_num_in_sheet}: Übersprungen (SerpAPI Wiki Search Timestamp AY bereits gesetzt: '{ts_ay_val}').")
continue # Nächste Zeile, diese wurde schon geprüft
# --- ENDE NEUE PRÜFUNG ---
continue
# Prüfe, ob Zeile überhaupt verarbeitet werden soll
try:
# 1. Mitarbeiterzahl prüfen
# Mitarbeiterzahl prüfen
ma_val_str = row[col_indices["K"]] if len(row) > col_indices["K"] else "0"
try:
ma_val_str_cleaned = re.sub(r"[^\d]", "", ma_val_str)
@@ -394,60 +400,66 @@ def process_find_wiki_with_serp(sheet_handler, row_limit=None, min_employees=500
skipped_employee_count += 1
continue
# 2. Prüfen, ob Wiki URL (M) leer oder "k.A." ist
# Wiki URL (M) prüfen
m_value = row[col_indices["M"]] if len(row) > col_indices["M"] else ""
# Prüfe auf leer UND 'k.a.' (case-insensitive)
if m_value and m_value.strip().lower() != "k.a.":
skipped_m_filled_count += 1
continue
# Wenn wir hier sind, ist die Zeile ein Kandidat FÜR DIESEN LAUF
# Kandidat gefunden
company_name = row[col_indices["B"]] if len(row) > col_indices["B"] else ""
if not company_name:
logging.warning(f"Zeile {row_num_in_sheet}: Übersprungen, kein Firmenname für Suche vorhanden.")
continue
# --- SerpAPI Suche durchführen ---
# SerpAPI Suche
logging.info(f"Zeile {row_num_in_sheet}: Suche Wiki-URL für '{company_name}' (MA: {ma_val})...")
wiki_url_found = serp_wikipedia_lookup(company_name) # Annahme: nutzt logging
processed_rows += 1 # Zähle die durchgeführte Suche
time.sleep(1.5) # Pause zwischen SerpAPI-Aufrufen
wiki_url_found = serp_wikipedia_lookup(company_name)
processed_rows += 1
time.sleep(1.5)
# --- Updates vorbereiten ---
# Timestamp AY IMMER setzen, um die Suche zu markieren
# Updates vorbereiten
# Timestamp AY IMMER setzen
row_updates = [{'range': f'{col_letters["AY"]}{row_num_in_sheet}', 'values': [[now_timestamp_str]]}]
if wiki_url_found:
logging.info(f" -> URL gefunden: {wiki_url_found}. Bereite Update vor.")
logging.info(f" -> URL gefunden: {wiki_url_found}. Bereite Update vor (Setze M, A; Lösche N-V, AN, AO, AP, AX).")
found_urls += 1
# Zusätzliche Updates nur, wenn URL gefunden wurde
# Zusätzliche Updates für gefundene URL
row_updates.extend([
{'range': f'{col_letters["M"]}{row_num_in_sheet}', 'values': [[wiki_url_found]]},
{'range': f'{col_letters["A"]}{row_num_in_sheet}', 'values': [['x']]},
{'range': f'{col_letters["M"]}{row_num_in_sheet}', 'values': [[wiki_url_found]]}, # URL setzen
{'range': f'{col_letters["A"]}{row_num_in_sheet}', 'values': [['x']]}, # ReEval Flag
# --- Spalten leeren ---
{'range': f'{col_letters["N"]}{row_num_in_sheet}', 'values': [['']]},
{'range': f'{col_letters["O"]}{row_num_in_sheet}', 'values': [['']]},
{'range': f'{col_letters["P"]}{row_num_in_sheet}', 'values': [['']]},
{'range': f'{col_letters["Q"]}{row_num_in_sheet}', 'values': [['']]},
{'range': f'{col_letters["R"]}{row_num_in_sheet}', 'values': [['']]},
{'range': f'{col_letters["S"]}{row_num_in_sheet}', 'values': [['']]},
{'range': f'{col_letters["T"]}{row_num_in_sheet}', 'values': [['']]},
{'range': f'{col_letters["U"]}{row_num_in_sheet}', 'values': [['']]},
{'range': f'{col_letters["V"]}{row_num_in_sheet}', 'values': [['']]},
{'range': f'{col_letters["AN"]}{row_num_in_sheet}', 'values': [['']]},
{'range': f'{col_letters["AO"]}{row_num_in_sheet}', 'values': [['']]}
{'range': f'{col_letters["AO"]}{row_num_in_sheet}', 'values': [['']]},
{'range': f'{col_letters["AP"]}{row_num_in_sheet}', 'values': [['']]},
{'range': f'{col_letters["AX"]}{row_num_in_sheet}', 'values': [['']]}
])
else:
logging.info(f" -> Keine Wiki-URL für '{company_name}' via SerpAPI gefunden.")
# Optional: Marker in M schreiben? Vorerst nicht, AY reicht.
# row_updates.append({'range': f'{col_letters["M"]}{row_num_in_sheet}', 'values': [['k.A. (SerpAPI Searched)']]})
# Nur AY Timestamp wird geschrieben
# Füge die Updates für diese Zeile zur Gesamtliste hinzu
all_sheet_updates.extend(row_updates)
except Exception as e:
# Logge Fehler und fahre mit der nächsten Zeile fort
logging.exception(f"Unerwarteter Fehler bei Verarbeitung von Zeile {row_num_in_sheet}: {e}")
continue # Gehe zur nächsten Zeile
continue
# --- Batch Update am Ende ---
# Dieser Block muss auf derselben Einrückungsebene wie die for-Schleife sein!
if all_sheet_updates:
logging.info(f"Sende Batch-Update für {processed_rows} geprüfte Zeilen ({found_urls} URLs gefunden, {len(all_sheet_updates)} Zellen)...")
success = sheet_handler.batch_update_cells(all_sheet_updates)
if success:
logging.info(f"Sheet-Update für 'find_wiki_serp' erfolgreich.")
# Fehler wird von batch_update_cells geloggt
else:
logging.info("Keine Zeilen gefunden, für die eine SerpAPI Wiki-Suche durchgeführt werden musste/konnte.")