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
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):
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
page_results = self.extract_current_page_results()
if not page_results and page_number > 1:
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)}")
# ALLE Ergebnisse einfach anhängen (keine Deduplizierung!)
all_companies.extend(page_results)
# --- Pagination-Button-Logik bleibt wie gehabt ---
try:
pagination_nav = self.driver.find_element(By.CSS_SELECTOR, "nav.eb-pagination")
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
# Warten, bis die Tabelle grundsätzlich geladen ist
table_selector = (By.CSS_SELECTOR, "table#t-result-table")
self.wait.until(EC.visibility_of_element_located(table_selector))
# --- NEU: Intelligente Scroll-Schleife ---
logger.info("Scrolle Seite nach unten, um alle Firmen zu laden...")
last_height = self.driver.execute_script("return document.querySelector('.scroll-viewport').scrollHeight")
while True:
self.driver.execute_script("document.querySelector('.scroll-viewport').scrollTo(0, document.querySelector('.scroll-viewport').scrollHeight);")
time.sleep(2) # Wartezeit für das Nachladen der Inhalte
new_height = self.driver.execute_script("return document.querySelector('.scroll-viewport').scrollHeight")
if new_height == last_height:
break
last_height = new_height
logger.info("Seitenende erreicht, alle Zeilen sollten geladen sein.")
if not next_button:
logger.info("Kein klickbarer 'Weiter'-Button mehr gefunden. Paginierung abgeschlossen.")
break
# 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)}")
logger.info("Klicke auf 'Weiter'-Button...")
# --- Paginierungs-Logik ---
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
# 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)
time.sleep(2)
logger.info(f"Klicke auf 'Weiter' zu Seite {page_number + 1}...")
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}")
# 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.")
break
return all_companies
return list(all_companies.values())
def close(self):
if self.driver: