diff --git a/dealfront_enrichment.py b/dealfront_enrichment.py index dbe2db7b..fb507ff5 100644 --- a/dealfront_enrichment.py +++ b/dealfront_enrichment.py @@ -133,61 +133,80 @@ class DealfrontScraper: def scrape_all_pages(self, max_pages=10): """ - Iteriert durch alle Ergebnisseiten, indem auf den letzten klickbaren - Button in der Paginierung geklickt wird. + Iteriert durch alle Ergebnisseiten, klickt auf den echten Weiter-Button, + und loggt alle Pagination-Buttons ausführlich für Debugging-Zwecke. """ 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: - first_row_element = self.wait.until(EC.visibility_of_element_located((By.CSS_SELECTOR, "table#t-result-table tbody tr[id]"))) - first_row_id = first_row_element.get_attribute("id") - except TimeoutException: - logger.warning("Konnte keine Datenzeilen mehr finden. Beende Paginierung.") - break - # Scrollen, um alle Elemente zu laden - self.driver.execute_script("window.scrollTo(0, document.body.scrollHeight);") - time.sleep(2) - + # Extrahiere aktuelle Seite page_results = self.extract_current_page_results() if not page_results and page_number > 1: + logger.warning("Keine Ergebnisse auf dieser Seite gefunden, breche ab.") break - + for company in page_results: unique_key = (company.get('name'), company.get('website')) if unique_key not in all_companies: all_companies[unique_key] = company - + logger.info(f"Seite {page_number}: {len(page_results)} Firmen gefunden. Gesamt einzigartig: {len(all_companies)}") + # --- DEBUG: Alle Pagination-Buttons loggen --- try: - # === FINALER, EINFACHER SELEKTOR === - # Finde den LETZTEN 'a'-Tag, der NICHT die Klasse 'disabled' hat. - next_button_selector = (By.XPATH, "//nav[contains(@class, 'eb-pagination')]//a[contains(@class, 'eb-pagination-button') and .//svg and not(contains(@class, 'disabled'))]") - next_button = self.wait.until(EC.element_to_be_clickable(next_button_selector)) - - # Sicherheitscheck: Wenn der Button keine Pfeil-Grafik enthält, sind wir am Ende. - if "fa-angle-right" not in next_button.get_attribute('innerHTML'): - logger.info("Letzte Seite erreicht (letzter Button ist eine Zahl).") - break + pagination_nav = self.driver.find_element(By.CSS_SELECTOR, "nav.eb-pagination") + buttons = pagination_nav.find_elements(By.CSS_SELECTOR, "a.eb-pagination-button") + logger.info(f"Gefundene Paginierungs-Buttons auf Seite {page_number}: {len(buttons)}") + for idx, btn in enumerate(buttons): + btn_text = btn.text.strip() + 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}") + buttons = [] - logger.info("Klicke auf 'Weiter'...") - self.driver.execute_script("arguments[0].click();", next_button) - - # Warten auf das Verschwinden der alten Zeile - old_first_row_element = self.driver.find_element(By.ID, first_row_id) - self.wait.until(EC.staleness_of(old_first_row_element)) - logger.info("Seitenwechsel erfolgreich verifiziert.") - - except (NoSuchElementException, TimeoutException): + # --- Suche nach dem Weiter-Button --- + next_button = None + for btn in buttons: + btn_html = btn.get_attribute('outerHTML') + # Heuristik: Button enthält ein SVG, ist nicht disabled und hat keinen Zahlentext + if ("svg" in btn_html) and ("disabled" not in btn.get_attribute('class')) and (btn.text.strip() == ""): + next_button = btn + break + + if not next_button: logger.info("Kein klickbarer 'Weiter'-Button mehr gefunden. Paginierung abgeschlossen.") break - + + logger.info("Klicke auf 'Weiter'-Button...") + try: + # Speichere vor dem Klick das erste Zeilen-Element, um später auf Aktualisierung zu warten + try: + first_row_element = self.driver.find_element(By.CSS_SELECTOR, "table#t-result-table tbody tr[id]") + except Exception: + first_row_element = None + + self.driver.execute_script("arguments[0].click();", next_button) + time.sleep(2) # Warte kurz auf das Nachladen + + # Warte auf das Nachladen der Tabelle + if first_row_element: + try: + self.wait.until(EC.staleness_of(first_row_element)) + logger.info("Seitenwechsel erfolgreich verifiziert (alte Zeile ist verschwunden).") + except Exception as e: + logger.warning(f"Timeout beim Warten auf das Nachladen der Tabelle: {e}") + else: + time.sleep(2) # Notfall: Warte einfach etwas länger + + except Exception as e: + logger.error(f"Fehler beim Klicken auf den Weiter-Button: {e}") + break + return list(all_companies.values()) def close(self):