dealfront_enrichment.py aktualisiert

This commit is contained in:
2025-07-13 09:59:25 +00:00
parent c780039751
commit 13e0e8ddfd

View File

@@ -133,29 +133,18 @@ class DealfrontScraper:
def scrape_all_pages(self, max_pages=10): def scrape_all_pages(self, max_pages=10):
""" """
Iteriert durch alle Ergebnisseiten, indem auf den letzten klickbaren Iteriert durch alle Ergebnisseiten, klickt auf den echten Weiter-Button,
Button in der Paginierung geklickt wird. und loggt alle Pagination-Buttons ausführlich für Debugging-Zwecke.
""" """
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} ---")
self.wait.until(EC.visibility_of_element_located((By.CSS_SELECTOR, "table#t-result-table"))) self.wait.until(EC.visibility_of_element_located((By.CSS_SELECTOR, "table#t-result-table")))
try: # Extrahiere aktuelle Seite
first_row_element = self.wait.until(EC.visibility_of_element_located((By.CSS_SELECTOR, "table#t-result-table tbody tr[id]")))
first_row_id = first_row_element.get_attribute("id")
except TimeoutException:
logger.warning("Konnte keine Datenzeilen mehr finden. Beende Paginierung.")
break
# Scrollen, um alle Elemente zu laden
self.driver.execute_script("window.scrollTo(0, document.body.scrollHeight);")
time.sleep(2)
page_results = self.extract_current_page_results() page_results = self.extract_current_page_results()
if not page_results and page_number > 1: if not page_results and page_number > 1:
logger.warning("Keine Ergebnisse auf dieser Seite gefunden, breche ab.")
break break
for company in page_results: for company in page_results:
@@ -165,29 +154,59 @@ class DealfrontScraper:
logger.info(f"Seite {page_number}: {len(page_results)} Firmen gefunden. Gesamt einzigartig: {len(all_companies)}") logger.info(f"Seite {page_number}: {len(page_results)} Firmen gefunden. Gesamt einzigartig: {len(all_companies)}")
# --- DEBUG: Alle Pagination-Buttons loggen ---
try: try:
# === FINALER, EINFACHER SELEKTOR === pagination_nav = self.driver.find_element(By.CSS_SELECTOR, "nav.eb-pagination")
# Finde den LETZTEN 'a'-Tag, der NICHT die Klasse 'disabled' hat. buttons = pagination_nav.find_elements(By.CSS_SELECTOR, "a.eb-pagination-button")
next_button_selector = (By.XPATH, "//nav[contains(@class, 'eb-pagination')]//a[contains(@class, 'eb-pagination-button') and .//svg and not(contains(@class, 'disabled'))]") logger.info(f"Gefundene Paginierungs-Buttons auf Seite {page_number}: {len(buttons)}")
next_button = self.wait.until(EC.element_to_be_clickable(next_button_selector)) 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 = []
# Sicherheitscheck: Wenn der Button keine Pfeil-Grafik enthält, sind wir am Ende. # --- Suche nach dem Weiter-Button ---
if "fa-angle-right" not in next_button.get_attribute('innerHTML'): next_button = None
logger.info("Letzte Seite erreicht (letzter Button ist eine Zahl).") for btn in buttons:
btn_html = btn.get_attribute('outerHTML')
# Heuristik: Button enthält ein SVG, ist nicht disabled und hat keinen Zahlentext
if ("svg" in btn_html) and ("disabled" not in btn.get_attribute('class')) and (btn.text.strip() == ""):
next_button = btn
break break
logger.info("Klicke auf 'Weiter'...") if not next_button:
self.driver.execute_script("arguments[0].click();", next_button)
# Warten auf das Verschwinden der alten Zeile
old_first_row_element = self.driver.find_element(By.ID, first_row_id)
self.wait.until(EC.staleness_of(old_first_row_element))
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...")
try:
# Speichere vor dem Klick das erste Zeilen-Element, um später auf Aktualisierung zu warten
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) # Warte kurz auf das Nachladen
# Warte auf das Nachladen der Tabelle
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) # Notfall: Warte einfach etwas länger
except Exception as e:
logger.error(f"Fehler beim Klicken auf den Weiter-Button: {e}")
break
return list(all_companies.values()) return list(all_companies.values())
def close(self): def close(self):