scrape_fotograf.py aktualisiert
This commit is contained in:
@@ -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.")
|
||||
|
||||
Reference in New Issue
Block a user