dealfront_enrichment.py aktualisiert
This commit is contained in:
@@ -85,7 +85,7 @@ class DealfrontScraper:
|
|||||||
logger.error(f"Konnte Debug-Artefakte nicht speichern: {e}")
|
logger.error(f"Konnte Debug-Artefakte nicht speichern: {e}")
|
||||||
|
|
||||||
def login(self):
|
def login(self):
|
||||||
"""Führt NUR den Login-Prozess durch und wartet danach eine feste Zeit."""
|
"""Führt NUR den Login-Prozess durch. Klickt und geht sofort weiter."""
|
||||||
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
|
||||||
@@ -98,10 +98,7 @@ class DealfrontScraper:
|
|||||||
self.driver.find_element(By.CSS_SELECTOR, "input[type='password']").send_keys(password)
|
self.driver.find_element(By.CSS_SELECTOR, "input[type='password']").send_keys(password)
|
||||||
self.driver.find_element(By.XPATH, "//button[normalize-space()='Log in']").click()
|
self.driver.find_element(By.XPATH, "//button[normalize-space()='Log in']").click()
|
||||||
|
|
||||||
logger.info("Login-Befehl gesendet. Warte jetzt eine feste Zeit von 15 Sekunden, um die Session vollständig zu etablieren.")
|
logger.info("Login-Befehl gesendet. Die Seite leitet nun weiter.")
|
||||||
time.sleep(15) # NEU: Erhöhte Wartezeit auf 15 Sekunden
|
|
||||||
|
|
||||||
logger.info("Wartezeit nach Login beendet. Gehe zum nächsten Schritt.")
|
|
||||||
return True
|
return True
|
||||||
|
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
@@ -109,6 +106,28 @@ class DealfrontScraper:
|
|||||||
self._save_debug_artifacts()
|
self._save_debug_artifacts()
|
||||||
return False
|
return False
|
||||||
|
|
||||||
|
def navigate_to_target(self):
|
||||||
|
"""Navigiert direkt zur Target-URL und wartet auf Bestätigung."""
|
||||||
|
try:
|
||||||
|
logger.info(f"Navigiere direkt zur Target-URL: {Config.DEALFRONT_TARGET_URL}")
|
||||||
|
self.driver.get(Config.DEALFRONT_TARGET_URL)
|
||||||
|
|
||||||
|
# Warten, bis die URL sich tatsächlich ändert.
|
||||||
|
self.wait.until(EC.url_contains("/t/prospector/"))
|
||||||
|
logger.info(f"URL-Wechsel bestätigt. Aktuelle URL: {self.driver.current_url}")
|
||||||
|
|
||||||
|
# Warten, bis die Seite gerendert ist.
|
||||||
|
verification_selector = (By.XPATH, "//button[normalize-space()='+ Neue Suche']")
|
||||||
|
self.wait.until(EC.visibility_of_element_located(verification_selector))
|
||||||
|
|
||||||
|
logger.info("'Target'-Seite erfolgreich und vollständig geladen.")
|
||||||
|
return True
|
||||||
|
|
||||||
|
except Exception as e:
|
||||||
|
logger.critical(f"Navigation zur 'Target'-Seite fehlgeschlagen: {type(e).__name__}", exc_info=True)
|
||||||
|
self._save_debug_artifacts()
|
||||||
|
return False
|
||||||
|
|
||||||
def navigate_to_target(self):
|
def navigate_to_target(self):
|
||||||
"""
|
"""
|
||||||
Navigiert zum 'Target'-Bereich und verifiziert den Erfolg in drei Schritten.
|
Navigiert zum 'Target'-Bereich und verifiziert den Erfolg in drei Schritten.
|
||||||
@@ -208,7 +227,7 @@ class DealfrontScraper:
|
|||||||
self.driver.quit()
|
self.driver.quit()
|
||||||
|
|
||||||
if __name__ == "__main__":
|
if __name__ == "__main__":
|
||||||
logger.info("Starte Dealfront Automatisierung - Phase 2a: Suche und Extraktion")
|
logger.info("Starte Dealfront Automatisierung - Rekonstruierter Workflow")
|
||||||
|
|
||||||
scraper = None
|
scraper = None
|
||||||
try:
|
try:
|
||||||
@@ -216,22 +235,22 @@ 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.")
|
||||||
|
|
||||||
# === GETRENNTE AUFRUFE ===
|
|
||||||
# Schritt 1: Login
|
# Schritt 1: Login
|
||||||
if not scraper.login():
|
if not scraper.login():
|
||||||
raise Exception("Login fehlgeschlagen.")
|
raise Exception("Login fehlgeschlagen.")
|
||||||
|
|
||||||
time.sleep(2) # Kurze Pause nach dem Login
|
# Kurze Pause, um der Weiterleitung nach dem Login eine Chance zu geben.
|
||||||
|
# Dies ist der einzige 'sleep', den wir brauchen.
|
||||||
|
time.sleep(5)
|
||||||
|
|
||||||
# Schritt 2: Navigation
|
# Schritt 2: Navigation
|
||||||
if not scraper.navigate_to_target():
|
if not scraper.navigate_to_target():
|
||||||
raise Exception("Navigation zur Target-Seite fehlgeschlagen.")
|
raise Exception("Navigation zur Target-Seite fehlgeschlagen.")
|
||||||
|
|
||||||
# Schritt 3: Suche laden
|
# ... (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.")
|
||||||
|
|
||||||
# Schritt 4: Ergebnisse extrahieren und ausgeben
|
|
||||||
companies = scraper.extract_current_page_results()
|
companies = scraper.extract_current_page_results()
|
||||||
if companies:
|
if companies:
|
||||||
df = pd.DataFrame(companies)
|
df = pd.DataFrame(companies)
|
||||||
@@ -247,7 +266,7 @@ if __name__ == "__main__":
|
|||||||
else:
|
else:
|
||||||
logger.warning("Keine Firmen auf der ersten Seite extrahiert oder gefunden.")
|
logger.warning("Keine Firmen auf der ersten Seite extrahiert oder gefunden.")
|
||||||
|
|
||||||
logger.info("Phase 2a Test erfolgreich abgeschlossen. Warte vor dem Schließen...")
|
logger.info("Test erfolgreich abgeschlossen. Warte vor dem Schließen...")
|
||||||
time.sleep(10)
|
time.sleep(10)
|
||||||
|
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
|
|||||||
Reference in New Issue
Block a user