dealfront_enrichment.py aktualisiert

This commit is contained in:
2025-07-04 04:46:11 +00:00
parent 8650a69aec
commit 5f5605c1e2

View File

@@ -84,47 +84,45 @@ class DealfrontScraper:
except Exception as e: except Exception as e:
logger.error(f"Konnte Debug-Artefakte nicht speichern: {e}") logger.error(f"Konnte Debug-Artefakte nicht speichern: {e}")
def login(self): def login_and_navigate_to_target(self):
""" """
Führt den Login-Prozess durch, indem menschliches Verhalten simuliert wird: Führt den Login durch und klickt dann auf dem Dashboard auf den
1. Seite laden. "Quick Link", um zur Target-Seite zu gelangen.
2. Warten bis URL korrekt ist.
3. Warten bis Formular da ist.
4. Ausfüllen und klicken.
""" """
if not self.driver: return False if not self.driver: return False
username, password = self._load_credentials() username, password = self._load_credentials()
if not username or not password: return False if not username or not password: return False
try: try:
# SCHRITT 1: SEITE LADEN # SCHRITT 1: LOGIN
logger.info(f"Navigiere zur Login-Seite: {DEALFRONT_LOGIN_URL}") logger.info(f"Navigiere zur Login-Seite: {DEALFRONT_LOGIN_URL}")
self.driver.get(DEALFRONT_LOGIN_URL) self.driver.get(DEALFRONT_LOGIN_URL)
# SCHRITT 2: VERIFIZIEREN, DASS DIE SEITE VOLLSTÄNDIG GELADEN IST self.wait.until(EC.visibility_of_element_located((By.NAME, "email"))).send_keys(username)
# Wir warten darauf, dass die URL in der Adressleiste die Login-URL enthält. self.driver.find_element(By.CSS_SELECTOR, "input[type='password']").send_keys(password)
# Das ist ein starkes Indiz, dass die Seite nicht im Ladezustand festhängt. self.driver.find_element(By.XPATH, "//button[normalize-space()='Log in']").click()
self.wait.until(EC.url_contains("login")) logger.info("Login-Befehl gesendet.")
logger.info("Login-Seite URL erfolgreich bestätigt. Warte kurz, damit die Seite rendern kann...")
time.sleep(3) # Kurze Atempause für die Seite
# SCHRITT 3: FORMULAR FINDEN UND AUSFÜLLEN # SCHRITT 2: AUF QUICK-LINK-KACHEL WARTEN UND KLICKEN
logger.info("Suche nach dem E-Mail-Eingabefeld...") logger.info("Warte auf Dashboard und 'Prospects finden'-Link in den Quick Links.")
email_field = self.wait.until(EC.visibility_of_element_located((By.NAME, "email")))
logger.info("E-Mail-Feld gefunden. Fülle Formulardaten aus.")
email_field.send_keys(username)
password_field = self.driver.find_element(By.CSS_SELECTOR, "input[type='password']") # Dieser XPath ist sehr spezifisch für den Link in der "Quick links"-Kachel
password_field.send_keys(password) prospects_link_selector = (By.XPATH, "//a[@data-test-target-product-tile]")
prospects_link = self.wait.until(EC.element_to_be_clickable(prospects_link_selector))
login_button = self.driver.find_element(By.XPATH, "//button[normalize-space()='Log in']") logger.info("'Prospects finden'-Link gefunden. Klicke darauf...")
login_button.click() prospects_link.click()
logger.info("Login-Befehl gesendet. Die Seite sollte nun weiterleiten.") # SCHRITT 3: NAVIGATION VERIFIZIEREN
logger.info("Warte auf die finale Target-Seite...")
verification_target_selector = (By.XPATH, "//button[normalize-space()='+ Neue Suche']")
self.wait.until(EC.visibility_of_element_located(verification_target_selector))
logger.info("'Target'-Seite erfolgreich und vollständig geladen.")
return True return True
except Exception as e: except Exception as e:
logger.critical(f"Login-Prozess ist fehlgeschlagen: {type(e).__name__}", exc_info=True) logger.critical(f"Login- oder Navigationsprozess fehlgeschlagen: {type(e).__name__}", exc_info=True)
self._save_debug_artifacts() self._save_debug_artifacts()
return False return False
@@ -249,7 +247,7 @@ class DealfrontScraper:
self.driver.quit() self.driver.quit()
if __name__ == "__main__": if __name__ == "__main__":
logger.info("Starte Dealfront Automatisierung - Rekonstruierter Workflow") logger.info("Starte Dealfront Automatisierung - Finaler Workflow")
scraper = None scraper = None
try: try:
@@ -257,19 +255,11 @@ if __name__ == "__main__":
if not scraper.driver: if not scraper.driver:
raise Exception("WebDriver konnte nicht initialisiert werden.") raise Exception("WebDriver konnte nicht initialisiert werden.")
# Schritt 1: Login # === EINZIGER AUFRUF FÜR LOGIN UND NAVIGATION ===
if not scraper.login(): if not scraper.login_and_navigate_to_target():
raise Exception("Login fehlgeschlagen.") raise Exception("Login und Navigation fehlgeschlagen.")
# Kurze Pause, um der Weiterleitung nach dem Login eine Chance zu geben. # Ab hier geht es weiter wie geplant...
# Dies ist der einzige 'sleep', den wir brauchen.
time.sleep(5)
# Schritt 2: Navigation
if not scraper.navigate_to_target():
raise Exception("Navigation zur Target-Seite fehlgeschlagen.")
# ... (Rest der main-Funktion mit Suche und Extraktion bleibt gleich) ...
if not scraper.load_search(Config.TARGET_SEARCH_NAME): if not scraper.load_search(Config.TARGET_SEARCH_NAME):
raise Exception(f"Laden der Suche '{Config.TARGET_SEARCH_NAME}' fehlgeschlagen.") raise Exception(f"Laden der Suche '{Config.TARGET_SEARCH_NAME}' fehlgeschlagen.")