dealfront_enrichment.py aktualisiert

This commit is contained in:
2025-07-13 16:22:46 +00:00
parent d4f9d02738
commit 6a5fe4df02

View File

@@ -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: