From 08d53cd0fd92921fab51dae0942f8a878b4895b8 Mon Sep 17 00:00:00 2001 From: Floke Date: Sun, 13 Jul 2025 16:11:19 +0000 Subject: [PATCH] dealfront_enrichment.py aktualisiert --- dealfront_enrichment.py | 63 +++++++++++++++++++++++++++++------------ 1 file changed, 45 insertions(+), 18 deletions(-) diff --git a/dealfront_enrichment.py b/dealfront_enrichment.py index bc5f5e22..23ca8167 100644 --- a/dealfront_enrichment.py +++ b/dealfront_enrichment.py @@ -139,7 +139,11 @@ class DealfrontScraper: all_companies = [] for page_number in range(1, max_pages + 1): logger.info(f"--- Verarbeite Seite {page_number} ---") - self.wait.until(EC.visibility_of_element_located((By.CSS_SELECTOR, "table#t-result-table"))) + try: + self.wait.until(EC.visibility_of_element_located((By.CSS_SELECTOR, "table#t-result-table"))) + except TimeoutException: + logger.error("Ergebnistabelle wurde nicht geladen. Breche ab.") + break # Vor dem Klick: Erste Zeilen-ID und Text merken try: @@ -147,10 +151,10 @@ class DealfrontScraper: first_row_id = first_row_element.get_attribute("id") first_row_text = first_row_element.text.strip() logger.info(f"Vor Pagination: Erste Zeilen-ID: {first_row_id}, Text: '{first_row_text}'") - except Exception as e: + except NoSuchElementException: first_row_id = None first_row_text = None - logger.warning(f"Vor Pagination: Keine Zeilen-ID gefunden: {e}") + logger.warning("Vor Pagination: Keine Zeilen-ID gefunden.") # Extrahiere aktuelle Seite page_results = self.extract_current_page_results() @@ -167,17 +171,20 @@ class DealfrontScraper: btn_classes = btn.get_attribute('class') btn_html = btn.get_attribute('outerHTML') has_svg = "svg" in btn_html - logger.info(f"Button {idx}: Text='{btn_text}', Klassen='{btn_classes}', SVG={has_svg}, HTML={btn_html}") - except Exception as e: - logger.warning(f"Konnte Pagination-Buttons nicht vollständig loggen: {e}") + logger.info(f"Button {idx}: Text='{btn_text}', Klassen='{btn_classes}', SVG={has_svg}, HTML-Start={btn_html[:120]}...") + except NoSuchElementException: + logger.warning("Keine Pagination-Buttons gefunden.") buttons = [] # Suche nach dem Weiter-Button next_button = None - for i, r in enumerate(all_rows): - html_snippet = r.get_attribute('outerHTML')[:120].replace('\n', ' ') - logger.info(f"Zeile {i}: Text='{r.text.strip()}', HTML-Start={html_snippet}...") - if ("svg" in btn_html) and ("disabled" not in btn.get_attribute('class')) and (btn.text.strip() == ""): + for idx, btn in enumerate(buttons): + btn_html = btn.get_attribute('outerHTML') + btn_text = btn.text.strip() + btn_classes = btn.get_attribute('class') + has_svg = "svg" in btn_html + is_disabled = "disabled" in btn_classes + if has_svg and not is_disabled and btn_text == "": next_button = btn logger.info(f"Als Weiter-Button erkannt: Button {idx}") break @@ -200,7 +207,29 @@ class DealfrontScraper: # Warte auf neue Seite: Änderung der ID ODER Änderung des Texts der ersten Zeile def page_changed(driver): try: - except Exception as e: + row = driver.find_element(By.CSS_SELECTOR, "table#t-result-table tbody tr[id]") + row_id = row.get_attribute("id") + row_text = row.text.strip() + logger.debug(f"Nach Pagination: Erste Zeilen-ID: {row_id}, Text: '{row_text}'") + if first_row_id and row_id != first_row_id: + return True + if first_row_text and row_text != first_row_text: + return True + return False + except Exception: + return False + + self.wait.until(page_changed) + logger.info("Seitenwechsel erfolgreich verifiziert (erste Zeile hat neue ID oder neuen Text).") + + # Logge die aktuelle aktive Seite + try: + active_page = self.driver.find_element(By.CSS_SELECTOR, "a.eb-pagination-button.active").text.strip() + logger.info(f"Aktive Seite nach Pagination: {active_page}") + except NoSuchElementException: + logger.warning("Konnte aktive Seite nach Pagination nicht ermitteln.") + + except Exception as e: logger.error(f"Fehler beim Klicken auf den Weiter-Button oder beim Warten auf neue Seite: {e}") # Screenshot und HTML speichern try: @@ -214,14 +243,12 @@ class DealfrontScraper: # Zusätzlich: Logge alle Zeilen nach dem Fehler (nur Text und HTML-Start) try: all_rows = self.driver.find_elements(By.CSS_SELECTOR, "table#t-result-table tbody tr") + logger.info(f"Nach Pagination-Fehler: Es sind {len(all_rows)} Zeilen im DOM.") + for i, r in enumerate(all_rows): + html_snippet = r.get_attribute('outerHTML')[:120].replace('\n', ' ') + logger.info(f"Zeile {i}: Text='{r.text.strip()}', HTML-Start={html_snippet}...") except Exception as eee: - logger.error(f"Fehler beim Finden der Tabellenzeilen nach Fehler: {eee}") - all_rows = [] - - logger.info(f"Nach Pagination-Fehler: Es sind {len(all_rows)} Zeilen im DOM.") - for i, r in enumerate(all_rows): - html_snippet = r.get_attribute('outerHTML')[:120].replace('\n', ' ') - logger.info(f"Zeile {i}: Text='{r.text.strip()}', HTML-Start={html_snippet}...") + logger.error(f"Fehler beim Loggen der Zeilen nach Fehler: {eee}") break return all_companies