diff --git a/dealfront_enrichment.py b/dealfront_enrichment.py index 8e5e7bbf..60359da9 100644 --- a/dealfront_enrichment.py +++ b/dealfront_enrichment.py @@ -108,6 +108,25 @@ class DealfrontScraper: except Exception as e: logger.warning(f"Fehler beim langsamen Scrollen: {e}") + def wait_for_table_content_change(self, previous_first_cell_text, timeout=20): + """ + Wartet, bis sich der Text der ersten Zelle der Tabelle geändert hat. + """ + start_time = time.time() + while time.time() - start_time < timeout: + try: + first_cell = self.driver.find_element(By.CSS_SELECTOR, "table#t-result-table tbody tr:first-child td") + current_text = first_cell.text.strip() + if current_text and current_text != previous_first_cell_text: + logger.info(f"Text der ersten Zelle hat sich geändert: '{previous_first_cell_text}' -> '{current_text}'") + return True + except Exception: + pass + time.sleep(0.5) + logger.warning("Timeout beim Warten auf Änderung des Inhalts der ersten Tabellenzelle.") + return False + + def navigate_and_load_search(self, search_name): try: logger.info(f"Navigiere direkt zur Target-Seite und lade die Suche...") @@ -148,11 +167,8 @@ class DealfrontScraper: return results def scrape_all_pages(self, max_pages=10): - """ - Iteriert durch alle Ergebnisseiten, wartet nach jedem Paginieren explizit auf neue Seitenzahl, - wartet nach jedem Seitenwechsel und Scrollen ausreichend, und sammelt alle Firmenzeilen seitengetreu. - """ all_companies = [] + previous_first_cell_text = "" for page_number in range(1, max_pages + 1): logger.info(f"--- Verarbeite Seite {page_number} ---") try: @@ -161,20 +177,18 @@ class DealfrontScraper: logger.error("Ergebnistabelle wurde nicht geladen. Breche ab.") break - # Zusätzlicher Puffer nach dem Laden der Tabelle logger.info("Warte 5 Sekunden, um sicherzugehen, dass alle Daten geladen sind...") time.sleep(5) - # Vor Pagination: Aktive Seitenzahl merken + # Vor Pagination: Text der ersten Zelle merken try: - 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: - active_page_num = None - logger.warning("Vor Pagination: Konnte aktive Seite nicht ermitteln.") + first_cell = self.driver.find_element(By.CSS_SELECTOR, "table#t-result-table tbody tr:first-child td") + previous_first_cell_text = first_cell.text.strip() + logger.info(f"Text der ersten Zelle vor Pagination: '{previous_first_cell_text}'") + except Exception: + previous_first_cell_text = "" + logger.warning("Konnte Text der ersten Zelle vor Pagination nicht ermitteln.") - # Nach unten scrollen und erneut warten self.scroll_table_slowly() logger.info("Warte nach Scrollen nochmals 3 Sekunden...") time.sleep(3) @@ -223,18 +237,8 @@ class DealfrontScraper: self.driver.execute_script("arguments[0].click();", next_button) logger.info("Klick auf Weiter-Button ausgeführt.") - # Warte auf neue aktive Seitenzahl - def page_changed(driver): - try: - 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 (aktive Seitenzahl hat sich geändert).") + # Warte auf Änderung des Inhalts der ersten Tabellenzelle + self.wait_for_table_content_change(previous_first_cell_text, timeout=30) except Exception as e: logger.error(f"Fehler beim Klicken auf den Weiter-Button oder beim Warten auf neue Seite: {e}")