From 01a6ff694d549949e326ffc590670549e0744fdd Mon Sep 17 00:00:00 2001 From: Floke Date: Fri, 4 Jul 2025 04:59:07 +0000 Subject: [PATCH] erweitertes Log. Seitenzugriff klappt jetzt --- dealfront_enrichment.py | 52 +++++++++++++++++++++++++---------------- 1 file changed, 32 insertions(+), 20 deletions(-) diff --git a/dealfront_enrichment.py b/dealfront_enrichment.py index 5638daf3..8eb0d637 100644 --- a/dealfront_enrichment.py +++ b/dealfront_enrichment.py @@ -16,9 +16,23 @@ from config import Config, DEALFRONT_LOGIN_URL, DEALFRONT_CREDENTIALS_FILE, DEAL # Logging-Konfiguration LOG_LEVEL = logging.DEBUG if Config.DEBUG else logging.INFO LOG_FORMAT = '%(asctime)s - %(levelname)-8s - %(name)-25s - %(message)s' + +# Root-Logger konfigurieren (gilt für alle Bibliotheken) logging.basicConfig(level=LOG_LEVEL, format=LOG_FORMAT, force=True) + +# Logger für Selenium auf INFO setzen, um Spam zu vermeiden +logging.getLogger("selenium").setLevel(logging.INFO) + +# Logger für unser eigenes Skript logger = logging.getLogger(__name__) +# FileHandler hinzufügen, um in eine Datei zu loggen +log_filename = f"dealfront_run_{time.strftime('%Y%m%d-%H%M%S')}.log" +log_filepath = os.path.join(OUTPUT_DIR, log_filename) +file_handler = logging.FileHandler(log_filepath, mode='w', encoding='utf-8') +file_handler.setFormatter(logging.Formatter(LOG_FORMAT)) +logging.getLogger().addHandler(file_handler) + OUTPUT_DIR = "/app/output" class DealfrontScraper: @@ -209,42 +223,40 @@ class DealfrontScraper: def extract_current_page_results(self): """ Extrahiert die Firmennamen und Webseiten von der aktuellen Ergebnisseite - unter Verwendung der verifizierten und präzisen CSS-Selektoren. + mit einem finalen, robusten XPath-Selektor. """ try: logger.info("Extrahiere Ergebnisse von der aktuellen Seite...") results = [] - rows_selector = (By.CSS_SELECTOR, "table#t-result-table tbody > tr[id]") - self.wait.until(EC.presence_of_element_located(rows_selector)) - time.sleep(3) + # Warten, bis die Tabelle (bzw. ihr Body) da ist + self.wait.until(EC.presence_of_element_located((By.CSS_SELECTOR, "table#t-result-table tbody"))) + time.sleep(3) # Letzte Pause, um das Rendern abzuwarten + + # Dieser XPath sucht nach allen `tr`-Elementen, die eine Zelle (td) enthalten, + # welche wiederum ein Element mit einem 'data-userpilot-id' Attribut hat, das mit 'company-name-cell' beginnt. + # Das ist ein sehr starkes Merkmal für eine Datenzeile. + rows_selector = (By.XPATH, "//table[@id='t-result-table']/tbody/tr[.//div[@data-userpilot-id and starts-with(@data-userpilot-id, 'company-name-cell')]]") rows = self.driver.find_elements(*rows_selector) if not rows: - logger.warning("Keine Ergebniszeilen (tr[id]) auf der Seite gefunden.") + logger.warning("Keine Ergebniszeilen gefunden. HTML-Struktur hat sich möglicherweise geändert.") self._save_debug_artifacts() return [] - logger.info(f"{len(rows)} Ergebniszeilen zur Verarbeitung gefunden.") + logger.info(f"{len(rows)} Firmen-Datenzeilen zur Verarbeitung gefunden.") - for i, row in enumerate(rows): - company_name, website = "", "" + for i, row in enumerate(rows, 1): try: - # --- IHR SELEKTOR FÜR FIRMENNAMEN --- - company_name_element = row.find_element(By.CSS_SELECTOR, ".sticky-column a.t-highlight-text") - company_name = company_name_element.get_attribute("title").strip() - - # --- IHR SELEKTOR FÜR WEBSITES --- - website_element = row.find_element(By.CSS_SELECTOR, "a.text-gray-400.t-highlight-text") - website = website_element.text.strip() - - if company_name and website: - results.append({'name': company_name, 'website': website}) + # Wir verwenden die stabilen Selektoren, die Sie identifiziert haben. + company_name = row.find_element(By.CSS_SELECTOR, ".sticky-column a.t-highlight-text").get_attribute("title").strip() + website = row.find_element(By.CSS_SELECTOR, "a.text-gray-400.t-highlight-text").text.strip() + results.append({'name': company_name, 'website': website}) except NoSuchElementException: - logger.warning(f"Zeile {i+1}: Name oder Webseite nicht gefunden. Überspringe.") + logger.warning(f"Zeile {i}: Konnte Name oder Webseite nicht extrahieren. Überspringe.") continue - logger.info(f"{len(results)} Firmen erfolgreich extrahiert.") + logger.info(f"Extraktion abgeschlossen. {len(results)} Firmen gefunden.") return results except Exception as e: