From 6a5fe4df0237ef5e08411d66fd59b0d4d22a5d2e Mon Sep 17 00:00:00 2001 From: Floke Date: Sun, 13 Jul 2025 16:22:46 +0000 Subject: [PATCH] dealfront_enrichment.py aktualisiert --- dealfront_enrichment.py | 49 ++++++++++++++++++++++++----------------- 1 file changed, 29 insertions(+), 20 deletions(-) diff --git a/dealfront_enrichment.py b/dealfront_enrichment.py index 23ca8167..47479524 100644 --- a/dealfront_enrichment.py +++ b/dealfront_enrichment.py @@ -92,6 +92,19 @@ class DealfrontScraper: self._save_debug_artifacts("login_exception") return False + def scroll_table_to_bottom(self): + """ + Scrollt das Tabellen-Element und die Seite nach unten, damit alle Zeilen sichtbar und geladen sind. + """ + try: + table = self.driver.find_element(By.CSS_SELECTOR, "table#t-result-table") + self.driver.execute_script("arguments[0].scrollIntoView(false);", table) + self.driver.execute_script("window.scrollTo(0, document.body.scrollHeight);") + time.sleep(1) # Kurze Pause, damit ggf. Inhalte nachgeladen werden + logger.info("Nach Seitenwechsel nach unten gescrollt.") + except Exception as e: + logger.warning(f"Fehler beim Scrollen nach unten: {e}") + def navigate_and_load_search(self, search_name): try: logger.info(f"Navigiere direkt zur Target-Seite und lade die Suche...") @@ -134,7 +147,7 @@ class DealfrontScraper: def scrape_all_pages(self, max_pages=10): """ Iteriert durch alle Ergebnisseiten, wartet nach jedem Paginieren explizit auf neue Daten, - und sammelt alle Firmenzeilen seitengetreu (keine Deduplizierung). + scrollt nach jedem Seitenwechsel nach unten und sammelt alle Firmenzeilen seitengetreu. """ all_companies = [] for page_number in range(1, max_pages + 1): @@ -145,16 +158,14 @@ class DealfrontScraper: logger.error("Ergebnistabelle wurde nicht geladen. Breche ab.") break - # Vor dem Klick: Erste Zeilen-ID und Text merken + # Vor dem Klick: IDs aller Zeilen merken try: - first_row_element = self.driver.find_element(By.CSS_SELECTOR, "table#t-result-table tbody tr[id]") - 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}'") + 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}") except NoSuchElementException: - first_row_id = None - first_row_text = None - logger.warning("Vor Pagination: Keine Zeilen-ID gefunden.") + ids_before = [] + logger.warning("Vor Pagination: Keine Zeilen gefunden.") # Extrahiere aktuelle Seite page_results = self.extract_current_page_results() @@ -204,23 +215,21 @@ class DealfrontScraper: self.driver.execute_script("arguments[0].click();", next_button) logger.info("Klick auf Weiter-Button ausgeführt.") - # Warte auf neue Seite: Änderung der ID ODER Änderung des Texts der ersten Zeile + # Warte auf neue Seite: Änderung der IDs der Zeilen def page_changed(driver): try: - 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 + 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 except Exception: return False self.wait.until(page_changed) - logger.info("Seitenwechsel erfolgreich verifiziert (erste Zeile hat neue ID oder neuen Text).") + logger.info("Seitenwechsel erfolgreich verifiziert (IDs der Zeilen haben sich geändert).") + + # NEU: Nach jedem Seitenwechsel nach unten scrollen! + self.scroll_table_to_bottom() # Logge die aktuelle aktive Seite try: