dealfront_enrichment.py aktualisiert
This commit is contained in:
@@ -126,43 +126,61 @@ class DealfrontScraper:
|
|||||||
continue
|
continue
|
||||||
return results
|
return results
|
||||||
|
|
||||||
def scrape_all_pages(self):
|
def scrape_all_pages(self, max_pages=10): # Sicherheitslimit für Seiten
|
||||||
all_companies = {}
|
"""
|
||||||
page_number = 1
|
Iteriert durch alle Ergebnisseiten, indem auf den 'Weiter'-Button geklickt wird.
|
||||||
while True:
|
Scrollt vor jeder Extraktion, um alle Elemente zu laden.
|
||||||
logger.info(f"--- Verarbeite Seite {page_number} ---")
|
"""
|
||||||
|
all_companies = {}
|
||||||
|
|
||||||
self.wait.until(EC.visibility_of_element_located((By.CSS_SELECTOR, "table#t-result-table")))
|
for page_number in range(1, max_pages + 1):
|
||||||
|
logger.info(f"--- Verarbeite Seite {page_number} ---")
|
||||||
try:
|
|
||||||
first_row_id = self.driver.find_element(By.CSS_SELECTOR, "table#t-result-table tbody tr[id]").get_attribute("id")
|
|
||||||
except NoSuchElementException:
|
|
||||||
logger.warning("Konnte keine Datenzeilen auf der Seite finden. Beende Paginierung.")
|
|
||||||
break
|
|
||||||
|
|
||||||
page_results = self.extract_current_page_results()
|
|
||||||
if not page_results and page_number > 1:
|
|
||||||
logger.info("Keine weiteren Ergebnisse auf der Seite extrahiert. Paginierung abgeschlossen.")
|
|
||||||
break
|
|
||||||
|
|
||||||
for company in page_results:
|
# 1. Warten, bis die Tabelle grundsätzlich geladen ist
|
||||||
if company.get('website') != 'N/A' and company.get('website'):
|
table_selector = (By.CSS_SELECTOR, "table#t-result-table tbody")
|
||||||
all_companies[company['website']] = company
|
self.wait.until(EC.visibility_of_element_located(table_selector))
|
||||||
|
|
||||||
logger.info(f"Seite {page_number}: {len(page_results)} Firmen gefunden. Gesamt einzigartig: {len(all_companies)}")
|
|
||||||
|
|
||||||
try:
|
|
||||||
next_button = self.wait.until(EC.element_to_be_clickable((By.CSS_SELECTOR, "a.eb-pagination-button:not(.disabled) svg[data-icon='angle-right']")))
|
|
||||||
self.driver.execute_script("arguments[0].click();", next_button)
|
|
||||||
page_number += 1
|
|
||||||
|
|
||||||
# Warten, bis die alte erste Zeile verschwunden ist
|
# 2. SCROLLEN: Scrolle die Seite nach unten, um alle Zeilen zu laden
|
||||||
self.wait.until(EC.staleness_of(self.driver.find_element(By.ID, first_row_id)))
|
logger.info("Scrolle nach unten, um alle Zeilen der Seite zu laden...")
|
||||||
except TimeoutException:
|
self.driver.execute_script("window.scrollTo(0, document.body.scrollHeight);")
|
||||||
logger.info("Kein klickbarer 'Weiter'-Button mehr gefunden. Paginierung abgeschlossen.")
|
time.sleep(2) # Kurze Pause, damit die neuen Zeilen rendern können
|
||||||
break
|
self.driver.execute_script("window.scrollTo(0, 0);") # Optional: wieder nach oben scrollen
|
||||||
|
time.sleep(1)
|
||||||
return list(all_companies.values())
|
|
||||||
|
# 3. DATEN EXTRAHIEREN
|
||||||
|
page_results = self.extract_current_page_results()
|
||||||
|
if not page_results:
|
||||||
|
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
|
||||||
|
|
||||||
|
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:
|
||||||
|
|||||||
Reference in New Issue
Block a user