dealfront_enrichment.py aktualisiert

This commit is contained in:
2025-07-13 14:43:59 +00:00
parent 9325bf3561
commit 7f9f43936a

View File

@@ -141,14 +141,16 @@ class DealfrontScraper:
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")))
# Vor dem Klick: Erste Zeilen-ID merken (oder Text, falls keine ID vorhanden) # Vor dem Klick: Erste Zeilen-ID und Text merken
try: try:
first_row_element = self.driver.find_element(By.CSS_SELECTOR, "table#t-result-table tbody tr[id]") first_row_element = self.driver.find_element(By.CSS_SELECTOR, "table#t-result-table tbody tr[id]")
first_row_id = first_row_element.get_attribute("id") first_row_id = first_row_element.get_attribute("id")
logger.debug(f"Vor Pagination: Erste Zeilen-ID ist {first_row_id}") first_row_text = first_row_element.text.strip()
except Exception: logger.info(f"Vor Pagination: Erste Zeilen-ID: {first_row_id}, Text: '{first_row_text}'")
except Exception as e:
first_row_id = None first_row_id = None
logger.debug("Vor Pagination: Keine Zeilen-ID gefunden.") first_row_text = None
logger.warning(f"Vor Pagination: Keine Zeilen-ID gefunden: {e}")
# Extrahiere aktuelle Seite # Extrahiere aktuelle Seite
page_results = self.extract_current_page_results() page_results = self.extract_current_page_results()
@@ -172,10 +174,11 @@ class DealfrontScraper:
# Suche nach dem Weiter-Button # Suche nach dem Weiter-Button
next_button = None next_button = None
for btn in buttons: for idx, btn in enumerate(buttons):
btn_html = btn.get_attribute('outerHTML') btn_html = btn.get_attribute('outerHTML')
if ("svg" in btn_html) and ("disabled" not in btn.get_attribute('class')) and (btn.text.strip() == ""): if ("svg" in btn_html) and ("disabled" not in btn.get_attribute('class')) and (btn.text.strip() == ""):
next_button = btn next_button = btn
logger.info(f"Als Weiter-Button erkannt: Button {idx}")
break break
if not next_button: if not next_button:
@@ -193,17 +196,28 @@ class DealfrontScraper:
self.driver.execute_script("arguments[0].click();", next_button) self.driver.execute_script("arguments[0].click();", next_button)
logger.info("Klick auf Weiter-Button ausgeführt.") logger.info("Klick auf Weiter-Button ausgeführt.")
# Warten, bis die erste Zeile eine andere ID hat (also wirklich neue Seite geladen ist) # Warte auf neue Seite: Änderung der ID ODER Änderung des Texts der ersten Zeile
if first_row_id: def page_changed(driver):
self.wait.until( try:
lambda d: d.find_element(By.CSS_SELECTOR, "table#t-result-table tbody tr[id]").get_attribute("id") != first_row_id row = driver.find_element(By.CSS_SELECTOR, "table#t-result-table tbody tr[id]")
) row_id = row.get_attribute("id")
logger.info("Seitenwechsel erfolgreich verifiziert (erste Zeile hat neue ID).") row_text = row.text.strip()
else: logger.debug(f"Nach Pagination: Erste Zeilen-ID: {row_id}, Text: '{row_text}'")
time.sleep(2) # Fallback, falls keine ID gefunden wurde if first_row_id and row_id != first_row_id:
return True
if first_row_text and row_text != first_row_text:
return True
return False
except Exception as e:
logger.warning(f"Fehler beim Vergleichen der ersten Zeile nach Pagination: {e}")
return False
self.wait.until(page_changed)
logger.info("Seitenwechsel erfolgreich verifiziert (erste Zeile hat neue ID oder neuen Text).")
except Exception as e: except Exception as e:
logger.error(f"Fehler beim Klicken auf den Weiter-Button oder beim Warten auf neue Seite: {e}") logger.error(f"Fehler beim Klicken auf den Weiter-Button oder beim Warten auf neue Seite: {e}")
# Optional: Screenshot und HTML speichern # Screenshot und HTML speichern
try: try:
timestamp = time.strftime("%Y%m%d-%H%M%S") timestamp = time.strftime("%Y%m%d-%H%M%S")
self.driver.save_screenshot(f"/app/output/pagination_error_{timestamp}.png") self.driver.save_screenshot(f"/app/output/pagination_error_{timestamp}.png")
@@ -212,6 +226,14 @@ class DealfrontScraper:
logger.info(f"Screenshot und HTML der Seite nach Pagination-Fehler gespeichert.") logger.info(f"Screenshot und HTML der Seite nach Pagination-Fehler gespeichert.")
except Exception as ee: except Exception as ee:
logger.error(f"Fehler beim Speichern von Screenshot/HTML: {ee}") logger.error(f"Fehler beim Speichern von Screenshot/HTML: {ee}")
# Zusätzlich: Logge alle Zeilen nach dem Fehler
try:
all_rows = self.driver.find_elements(By.CSS_SELECTOR, "table#t-result-table tbody tr")
logger.info(f"Nach Pagination-Fehler: Es sind {len(all_rows)} Zeilen im DOM.")
for i, r in enumerate(all_rows):
logger.info(f"Zeile {i}: Text='{r.text.strip()}', HTML={r.get_attribute('outerHTML')}")
except Exception as eee:
logger.error(f"Fehler beim Loggen der Zeilen nach Fehler: {eee}")
break break
return all_companies return all_companies