diff --git a/scrape_fotograf.py b/scrape_fotograf.py index cf86beba..5a061ac7 100644 --- a/scrape_fotograf.py +++ b/scrape_fotograf.py @@ -132,16 +132,13 @@ def process_full_job(driver, job_url): print(f"\n--- Betrete Album: {album['name']} ---") driver.get(album['url']) try: - # GEÄNDERT: Robuste Schleife, die den Stale-Element-Fehler verhindert num_persons = len(wait.until(EC.presence_of_all_elements_located((By.XPATH, SELECTORS["person_rows"])))) print(f"{num_persons} Personen in diesem Album gefunden.") for i in range(num_persons): - # In jeder Iteration die Elemente neu finden, um "Stale" zu vermeiden! person_rows = wait.until(EC.presence_of_all_elements_located((By.XPATH, SELECTORS["person_rows"]))) person_row = person_rows[i] - # Führe Aktionen nur aus, wenn Logins 0 sind. So vermeiden wir unnötige Navigation. login_count_text = person_row.find_element(By.XPATH, SELECTORS["person_logins"]).text if int(login_count_text) == 0: vorname = person_row.find_element(By.XPATH, SELECTORS["person_vorname"]).text @@ -151,38 +148,46 @@ def process_full_job(driver, job_url): driver.get(access_code_page_url) print(f" Navigiere zur Kommunikations-Seite für '{vorname}'...") - try: - # GEZIELTER TRY-BLOCK für die Interaktion auf der neuen Seite - schnell_login_url = wait.until(EC.visibility_of_element_located((By.XPATH, SELECTORS["quick_login_url"]))).get_attribute('href') - potential_buyer_element = wait.until(EC.element_to_be_clickable((By.XPATH, SELECTORS["potential_buyer_link"]))) - kaeufer_name = potential_buyer_element.text + # GEÄNDERTER, ROBUSTER BLOCK ZUR DATENEXTRAKTION + for attempt in range(3): + try: + # Wir warten explizit, bis die Seite die Details anzeigt (z.B. den Schnell-Login) + wait.until(EC.visibility_of_element_located((By.XPATH, SELECTORS["quick_login_url"]))) + + schnell_login_url = driver.find_element(By.XPATH, SELECTORS["quick_login_url"]).get_attribute('href') + potential_buyer_element = driver.find_element(By.XPATH, SELECTORS["potential_buyer_link"]) + kaeufer_name = potential_buyer_element.text + + print(f" Käufer: '{kaeufer_name}', Schnell-Login: GEFUNDEN") + potential_buyer_element.click() + + print(f" Navigiere zur Käufer-Detailseite...") + email = wait.until(EC.visibility_of_element_located((By.XPATH, SELECTORS["buyer_email"]))).text + print(f" FINALE ERFOLG: E-Mail gefunden: {email}") + + final_results.append({ + "Name des Kindes": vorname, + "Name Käufer": kaeufer_name, + "E-Mail-Adresse Käufer": email, + "Schnell Login URL": schnell_login_url + }) + break # Erfolg, also die Retry-Schleife verlassen - print(f" Käufer: '{kaeufer_name}', Schnell-Login: GEFUNDEN") + except StaleElementReferenceException: + print(f" Timing-Fehler (StaleElement), Versuch {attempt + 1}/3. Warte kurz...") + time.sleep(1) # Längere Pause, um der Seite Zeit zu geben + if attempt == 2: + print(" Fehler war persistent, überspringe diese Person.") + take_error_screenshot(driver, f"stale_error_{vorname}") + + except TimeoutException: + print(f" Timeout beim Warten auf Details für '{vorname}'. Überspringe.") + take_error_screenshot(driver, f"timeout_error_{vorname}") + break # Breche die Retry-Schleife ab, da Warten keinen Sinn macht - potential_buyer_element.click() - print(f" Navigiere zur Käufer-Detailseite...") - - email = wait.until(EC.visibility_of_element_located((By.XPATH, SELECTORS["buyer_email"]))).text - print(f" FINALE ERFOLG: E-Mail gefunden: {email}") - - final_results.append({ - "Name des Kindes": vorname, - "Name Käufer": kaeufer_name, - "E-Mail-Adresse Käufer": email, - "Schnell Login URL": schnell_login_url - }) - except (TimeoutException, StaleElementReferenceException) as e: - print(f" FEHLER beim Verarbeiten der Detailseite für '{vorname}'. Überspringe. Grund: {e}") - take_error_screenshot(driver, f"detail_page_error_{vorname}") - # Wichtig: Trotz Fehler zurückkehren, um die Schleife nicht zu sprengen - driver.get(album['url']) - wait.until(EC.presence_of_element_located((By.XPATH, SELECTORS["person_rows"]))) - continue - - # Wichtig: Navigiere zur Album-Seite zurück, bevor die Schleife weitergeht + # Zurückkehren zur Album-Übersicht für die nächste Person print(f" Kehre zurück zur Album-Übersicht '{album['name']}'...") driver.get(album['url']) - # Warten, bis die Seite wieder bereit ist für die nächste Iteration wait.until(EC.presence_of_element_located((By.XPATH, SELECTORS["person_rows"]))) except TimeoutException: print(f" Keine Personen-Daten im Album '{album['name']}' gefunden. Überspringe.")