From 0cf6d5d61cc2192b86c4f50dea58d2e8aa6aa52b Mon Sep 17 00:00:00 2001 From: Floke Date: Mon, 14 Jul 2025 06:27:39 +0000 Subject: [PATCH] dealfront_enrichment.py aktualisiert --- dealfront_enrichment.py | 41 ++++++++++++++++------------------------- 1 file changed, 16 insertions(+), 25 deletions(-) diff --git a/dealfront_enrichment.py b/dealfront_enrichment.py index 2f03af74..31b1c408 100644 --- a/dealfront_enrichment.py +++ b/dealfront_enrichment.py @@ -149,7 +149,7 @@ class DealfrontScraper: def scrape_all_pages(self, max_pages=10): """ - Iteriert durch alle Ergebnisseiten, wartet nach jedem Paginieren explizit auf neue Daten, + Iteriert durch alle Ergebnisseiten, wartet nach jedem Paginieren explizit auf neue Seitenzahl, scrollt nach jedem Seitenwechsel nach unten und sammelt alle Firmenzeilen seitengetreu. """ all_companies = [] @@ -161,14 +161,14 @@ class DealfrontScraper: logger.error("Ergebnistabelle wurde nicht geladen. Breche ab.") break - # Vor dem Klick: IDs aller Zeilen merken + # Vor dem Klick: Aktive Seitenzahl merken try: - rows_before = self.driver.find_elements(By.CSS_SELECTOR, "table#t-result-table tbody tr[id]") - ids_before = [r.get_attribute("id") for r in rows_before] - logger.info(f"Vor Pagination: IDs der Zeilen: {ids_before}") + active_page_elem = self.driver.find_element(By.CSS_SELECTOR, "a.eb-pagination-button.active") + active_page_num = active_page_elem.text.strip() + logger.info(f"Vor Pagination: Aktive Seite: {active_page_num}") except NoSuchElementException: - ids_before = [] - logger.warning("Vor Pagination: Keine Zeilen gefunden.") + active_page_num = None + logger.warning("Vor Pagination: Konnte aktive Seite nicht ermitteln.") # Extrahiere aktuelle Seite page_results = self.extract_current_page_results() @@ -212,27 +212,27 @@ class DealfrontScraper: try: # Button ins Sichtfeld scrollen! self.driver.execute_script("arguments[0].scrollIntoView({block: 'center'});", next_button) - time.sleep(0.5) # Kurze Pause, damit das Scrollen abgeschlossen ist + time.sleep(0.5) # Button wirklich klicken self.driver.execute_script("arguments[0].click();", next_button) logger.info("Klick auf Weiter-Button ausgeführt.") - # Warte auf neue Seite: Änderung der IDs der Zeilen + # Warte auf neue aktive Seitenzahl def page_changed(driver): try: - rows_after = driver.find_elements(By.CSS_SELECTOR, "table#t-result-table tbody tr[id]") - ids_after = [r.get_attribute("id") for r in rows_after] - logger.debug(f"Nach Pagination: IDs der Zeilen: {ids_after}") - return ids_after != ids_before and len(ids_after) > 0 + elem = driver.find_element(By.CSS_SELECTOR, "a.eb-pagination-button.active") + page_num = elem.text.strip() + logger.debug(f"Nach Pagination: Aktive Seite: {page_num}") + return page_num != active_page_num except Exception: return False self.wait.until(page_changed) - logger.info("Seitenwechsel erfolgreich verifiziert (IDs der Zeilen haben sich geändert).") + logger.info("Seitenwechsel erfolgreich verifiziert (aktive Seitenzahl hat sich geändert).") - # NEU: Nach jedem Seitenwechsel nach unten scrollen! - self.scroll_table_slowly() + # Nach jedem Seitenwechsel langsam nach unten scrollen! + self.scroll_window_slowly() # Logge die aktuelle aktive Seite try: @@ -252,15 +252,6 @@ class DealfrontScraper: logger.info(f"Screenshot und HTML der Seite nach Pagination-Fehler gespeichert.") except Exception as ee: logger.error(f"Fehler beim Speichern von Screenshot/HTML: {ee}") - # 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 Loggen der Zeilen nach Fehler: {eee}") break return all_companies