scrape_fotograf.py aktualisiert

This commit is contained in:
2025-07-16 18:12:34 +00:00
parent 9195a9ed86
commit 1c37f82b2f

View File

@@ -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.")