dealfront_enrichment.py aktualisiert

This commit is contained in:
2025-07-13 10:37:49 +00:00
parent 0aae809d76
commit d7a51f3a42

View File

@@ -131,77 +131,68 @@ class DealfrontScraper:
return results return results
def scrape_all_pages(self, max_pages=10): def scrape_all_pages(self, max_pages=6):
""" """
Iteriert durch alle Ergebnisseiten und sammelt ALLE Firmenzeilen (auch Duplikate). Iteriert durch alle Ergebnisseiten, scrollt auf jeder Seite nach unten,
um alle Daten zu laden, und extrahiert sie dann. Verhindert Duplikate.
""" """
all_companies = [] all_companies = {} # Verwende ein Dictionary, um Duplikate zu vermeiden
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} ---")
self.wait.until(EC.visibility_of_element_located((By.CSS_SELECTOR, "table#t-result-table")))
# Extrahiere aktuelle Seite # Warten, bis die Tabelle grundsätzlich geladen ist
page_results = self.extract_current_page_results() table_selector = (By.CSS_SELECTOR, "table#t-result-table")
if not page_results and page_number > 1: self.wait.until(EC.visibility_of_element_located(table_selector))
logger.warning("Keine Ergebnisse auf dieser Seite gefunden, breche ab.")
break
logger.info(f"Seite {page_number}: {len(page_results)} Firmen gefunden. Gesamt bisher: {len(all_companies) + len(page_results)}") # --- NEU: Intelligente Scroll-Schleife ---
logger.info("Scrolle Seite nach unten, um alle Firmen zu laden...")
# ALLE Ergebnisse einfach anhängen (keine Deduplizierung!) last_height = self.driver.execute_script("return document.querySelector('.scroll-viewport').scrollHeight")
all_companies.extend(page_results) while True:
self.driver.execute_script("document.querySelector('.scroll-viewport').scrollTo(0, document.querySelector('.scroll-viewport').scrollHeight);")
# --- Pagination-Button-Logik bleibt wie gehabt --- time.sleep(2) # Wartezeit für das Nachladen der Inhalte
try: new_height = self.driver.execute_script("return document.querySelector('.scroll-viewport').scrollHeight")
pagination_nav = self.driver.find_element(By.CSS_SELECTOR, "nav.eb-pagination") if new_height == last_height:
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 = []
# Suche nach dem Weiter-Button
next_button = None
for btn in buttons:
btn_html = btn.get_attribute('outerHTML')
if ("svg" in btn_html) and ("disabled" not in btn.get_attribute('class')) and (btn.text.strip() == ""):
next_button = btn
break break
last_height = new_height
logger.info("Seitenende erreicht, alle Zeilen sollten geladen sein.")
if not next_button: # Extrahiere die Daten von der komplett geladenen Seite
page_results = self.extract_current_page_results()
if not page_results:
logger.warning("Konnte auf dieser Seite keine Ergebnisse extrahieren, obwohl gescrollt wurde.")
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)}")
# --- Paginierungs-Logik ---
try:
# Wir merken uns die ID der LETZTEN Zeile, um den Wechsel zu verifizieren
last_row_id = self.driver.find_element(By.XPATH, "(//table[@id='t-result-table']/tbody/tr[@id])[last()]").get_attribute("id")
next_button_selector = (By.XPATH, "//nav[contains(@class, 'eb-pagination')]//a[not(contains(@class, 'disabled'))][last()]")
next_button = self.driver.find_element(*next_button_selector)
if "fa-angle-right" not in next_button.get_attribute('innerHTML'):
logger.info("Letzte Seite erreicht (kein 'Weiter'-Pfeil im letzten Button).")
break
self.driver.execute_script("arguments[0].click();", next_button)
logger.info(f"Klicke auf 'Weiter' zu Seite {page_number + 1}...")
# Warte darauf, dass die letzte Zeile der alten Seite verschwindet
self.wait.until(EC.staleness_of(self.driver.find_element(By.ID, last_row_id)))
logger.info("Seitenwechsel erfolgreich verifiziert.")
except (NoSuchElementException, TimeoutException):
logger.info("Kein klickbarer 'Weiter'-Button mehr gefunden. Paginierung abgeschlossen.") logger.info("Kein klickbarer 'Weiter'-Button mehr gefunden. Paginierung abgeschlossen.")
break break
logger.info("Klicke auf 'Weiter'-Button...") return list(all_companies.values())
try:
# Vor dem Klick: erste Zeile merken
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)
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)
except Exception as e:
logger.error(f"Fehler beim Klicken auf den Weiter-Button: {e}")
break
return all_companies
def close(self): def close(self):
if self.driver: if self.driver: