dealfront_enrichment.py aktualisiert

This commit is contained in:
2025-07-08 12:06:24 +00:00
parent 21ef32cc84
commit 26cb6c6fbc

View File

@@ -122,31 +122,37 @@ class DealfrontScraper:
logger.info("Extrahiere Ergebnisse mit direkten CSS-Selektoren...") logger.info("Extrahiere Ergebnisse mit direkten CSS-Selektoren...")
results = [] results = []
# Warten, bis das erste Firmenelement vorhanden ist. # Warten, bis das erste Element, das wir suchen (ein Firmenname), vorhanden ist.
company_name_selector = ".sticky-column a.t-highlight-text" company_name_selector = ".sticky-column a.t-highlight-text"
logger.info(f"Warte auf das erste Firmenelement mit Selektor: '{company_name_selector}'") logger.info(f"Warte auf das erste Firmenelement mit Selektor: '{company_name_selector}'")
self.wait.until(EC.presence_of_element_located((By.CSS_SELECTOR, company_name_selector))) self.wait.until(EC.presence_of_element_located((By.CSS_SELECTOR, company_name_selector)))
time.sleep(3)
# Extraktion aller Elemente time.sleep(3) # Letzte, kurze Pause, um sicherzustellen, dass alle Elemente gerendert sind.
company_elements = self.driver.find_elements(By.CSS_SELECTOR, company_name_selector)
website_elements = self.driver.find_elements(By.CSS_SELECTOR, "a.text-gray-400.t-highlight-text")
logger.info(f"{len(company_elements)} Firmennamen und {len(website_elements)} Webseiten-Elemente gefunden.") # Finde alle Tabellenzeilen, die eine ID haben. Das ist unser neuer, stabiler Anker.
rows_selector = (By.CSS_SELECTOR, "table#t-result-table tbody tr[id]")
rows = self.driver.find_elements(*rows_selector)
num_results = min(len(company_elements), len(website_elements)) if not rows:
if num_results == 0: logger.warning("Keine Datenzeilen gefunden. Speichere Debug-Artefakte.")
logger.warning("Keine Firmen oder Webseiten gefunden.")
self._save_debug_artifacts() self._save_debug_artifacts()
return [] return []
for i in range(num_results): logger.info(f"{len(rows)} Firmen-Datenzeilen zur Verarbeitung gefunden.")
company_name = company_elements[i].get_attribute("title").strip()
website = website_elements[i].text.strip() for i, row in enumerate(rows, 1):
try:
# Innerhalb jeder Zeile suchen wir nach den spezifischen Links.
company_name = row.find_element(By.CSS_SELECTOR, company_name_selector).get_attribute("title").strip()
website = row.find_element(By.CSS_SELECTOR, "td:nth-of-type(3) a").text.strip()
if company_name and website: if company_name and website:
results.append({'name': company_name, 'website': website}) results.append({'name': company_name, 'website': website})
except NoSuchElementException:
logger.warning(f"Zeile {i}: Name oder Webseite nicht extrahierbar. Überspringe.")
continue
logger.info(f"Extraktion abgeschlossen. {len(results)} Firmen erfolgreich zugeordnet.") logger.info(f"Extraktion abgeschlossen. {len(results)} Firmen gefunden.")
return results return results
except Exception as e: except Exception as e:
@@ -161,7 +167,7 @@ class DealfrontScraper:
if __name__ == "__main__": if __name__ == "__main__":
logger.info("Starte Dealfront Automatisierung - DEBUG-MODUS") logger.info("Starte Dealfront Automatisierung - Finaler Durchlauf")
scraper = None scraper = None
try: try:
scraper = DealfrontScraper() scraper = DealfrontScraper()
@@ -171,31 +177,33 @@ if __name__ == "__main__":
if not scraper.login_and_find_list(TempConfig.TARGET_SEARCH_NAME): if not scraper.login_and_find_list(TempConfig.TARGET_SEARCH_NAME):
raise Exception("Der Prozess vom Login bis zum Laden der Liste ist fehlgeschlagen.") raise Exception("Der Prozess vom Login bis zum Laden der Liste ist fehlgeschlagen.")
# In dieser Version gibt es keine handle_overlays Methode mehr # scraper.handle_overlays() # Vorerst deaktiviert, um Fehlerquellen zu minimieren
# scraper.handle_overlays()
companies = scraper.extract_current_page_results() companies = scraper.extract_current_page_results()
if companies: if companies:
df = pd.DataFrame(companies) df = pd.DataFrame(companies)
pd.set_option('display.max_rows', None) pd.set_option('display.max_rows', None)
pd.set_option('display.max_columns', None) pd.set_option('display.max_columns', None)
pd.set_option('display.width', 1000) pd.set_option('display.width', 120)
pd.set_option('display.max_colwidth', None) pd.set_option('display.max_colwidth', None)
print("\n" + "="*80) print("\n" + "="*80)
print(" EXTRAHIERTE FIRMEN (ERSTE SEITE) ".center(80, "=")) print(" EXTRAHIERTE FIRMEN (ERSTE SEITE) ".center(80, "="))
print("="*80) print("="*80)
print(df.to_string(index=False)) print(df.to_string(index=False))
print("="*80 + "\n") print("="*80 + "\n")
logger.info(f"Testlauf ERFOLGREICH. {len(df)} Firmen extrahiert.")
else: else:
logger.warning("Obwohl die Seite geladen wurde, konnten keine Firmen extrahiert werden.") logger.warning("PROZESS ABGESCHLOSSEN, ABER KEINE FIRMEN EXTRAHIERT. Bitte HTML-Dump im 'output'-Ordner prüfen.")
logger.info("Test erfolgreich abgeschlossen. Warte vor dem Schließen...")
time.sleep(10)
except Exception as e: except Exception as e:
logger.critical(f"Ein kritischer Fehler ist im Hauptprozess aufgetreten: {e}", exc_info=False) logger.critical(f"Ein kritischer Fehler ist im Hauptprozess aufgetreten: {e}", exc_info=False)
finally: finally:
if scraper: if scraper:
# Wir lassen den Browser für 15 Sekunden offen, um das Ergebnis zu sehen
logger.info("Prozess beendet. Browser bleibt zur Inspektion 15 Sekunden geöffnet...")
time.sleep(15)
scraper.close() scraper.close()
logger.info("Dealfront Automatisierung beendet.") logger.info("Dealfront Automatisierung beendet.")