dealfront_enrichment.py aktualisiert

This commit is contained in:
2025-07-11 09:15:50 +00:00
parent c4237a6fba
commit 340fcb5c60

View File

@@ -126,61 +126,61 @@ class DealfrontScraper:
continue continue
return results return results
def scrape_all_pages(self, max_pages=10): # Sicherheitslimit für Seiten def scrape_all_pages(self, max_pages=10): # Sicherheitslimit für Seiten
""" """
Iteriert durch alle Ergebnisseiten, indem auf den 'Weiter'-Button geklickt wird. Iteriert durch alle Ergebnisseiten, indem auf den 'Weiter'-Button geklickt wird.
Scrollt vor jeder Extraktion, um alle Elemente zu laden. Scrollt vor jeder Extraktion, um alle Elemente zu laden.
""" """
all_companies = {} all_companies = {}
for page_number in range(1, max_pages + 1): for page_number in range(1, max_pages + 1):
logger.info(f"--- Verarbeite Seite {page_number} ---") logger.info(f"--- Verarbeite Seite {page_number} ---")
# 1. Warten, bis die Tabelle grundsätzlich geladen ist # 1. Warten, bis die Tabelle grundsätzlich geladen ist
table_selector = (By.CSS_SELECTOR, "table#t-result-table tbody") table_selector = (By.CSS_SELECTOR, "table#t-result-table tbody")
self.wait.until(EC.visibility_of_element_located(table_selector)) self.wait.until(EC.visibility_of_element_located(table_selector))
# 2. SCROLLEN: Scrolle die Seite nach unten, um alle Zeilen zu laden # 2. SCROLLEN: Scrolle die Seite nach unten, um alle Zeilen zu laden
logger.info("Scrolle nach unten, um alle Zeilen der Seite zu laden...") logger.info("Scrolle nach unten, um alle Zeilen der Seite zu laden...")
self.driver.execute_script("window.scrollTo(0, document.body.scrollHeight);") self.driver.execute_script("window.scrollTo(0, document.body.scrollHeight);")
time.sleep(2) # Kurze Pause, damit die neuen Zeilen rendern können time.sleep(2) # Kurze Pause, damit die neuen Zeilen rendern können
self.driver.execute_script("window.scrollTo(0, 0);") # Optional: wieder nach oben scrollen self.driver.execute_script("window.scrollTo(0, 0);") # Optional: wieder nach oben scrollen
time.sleep(1) time.sleep(1)
# 3. DATEN EXTRAHIEREN # 3. DATEN EXTRAHIEREN
page_results = self.extract_current_page_results() page_results = self.extract_current_page_results()
if not page_results: if not page_results:
logger.info("Keine Ergebnisse auf dieser Seite extrahiert. Breche ab.") logger.info("Keine Ergebnisse auf dieser Seite extrahiert. Breche ab.")
break
for company in page_results:
# Verwende eine Kombination aus Name und Webseite als eindeutigen Schlüssel
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)}")
# 4. PAGINIERUNG
try:
# Robusterer Selektor für den "Weiter"-Button
next_button_selector = (By.XPATH, "//a[contains(@class, 'eb-pagination-button') and not(contains(@class, 'disabled'))][last()]")
next_button = self.driver.find_element(*next_button_selector)
# Prüfen, ob der gefundene Button der "Weiter"-Button ist (enthält Pfeil nach rechts)
if "fa-angle-right" not in next_button.get_attribute('innerHTML'):
logger.info("Letzte Seite erreicht (kein 'Weiter'-Pfeil im letzten Button).")
break break
for company in page_results: logger.info("Klicke auf 'Weiter'...")
# Verwende eine Kombination aus Name und Webseite als eindeutigen Schlüssel self.driver.execute_script("arguments[0].click();", next_button)
unique_key = (company.get('name'), company.get('website')) time.sleep(4) # Feste Wartezeit für den Seitenwechsel
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)}") except NoSuchElementException:
logger.info("Kein klickbarer 'Weiter'-Button mehr gefunden. Paginierung abgeschlossen.")
break
# 4. PAGINIERUNG return list(all_companies.values())
try:
# Robusterer Selektor für den "Weiter"-Button
next_button_selector = (By.XPATH, "//a[contains(@class, 'eb-pagination-button') and not(contains(@class, 'disabled'))][last()]")
next_button = self.driver.find_element(*next_button_selector)
# Prüfen, ob der gefundene Button der "Weiter"-Button ist (enthält Pfeil nach rechts)
if "fa-angle-right" not in next_button.get_attribute('innerHTML'):
logger.info("Letzte Seite erreicht (kein 'Weiter'-Pfeil im letzten Button).")
break
logger.info("Klicke auf 'Weiter'...")
self.driver.execute_script("arguments[0].click();", next_button)
time.sleep(4) # Feste Wartezeit für den Seitenwechsel
except NoSuchElementException:
logger.info("Kein klickbarer 'Weiter'-Button mehr gefunden. Paginierung abgeschlossen.")
break
return list(all_companies.values())
def close(self): def close(self):
if self.driver: if self.driver: