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']} ---")
|
print(f"\n--- Betrete Album: {album['name']} ---")
|
||||||
driver.get(album['url'])
|
driver.get(album['url'])
|
||||||
try:
|
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"]))))
|
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.")
|
print(f"{num_persons} Personen in diesem Album gefunden.")
|
||||||
|
|
||||||
for i in range(num_persons):
|
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_rows = wait.until(EC.presence_of_all_elements_located((By.XPATH, SELECTORS["person_rows"])))
|
||||||
person_row = person_rows[i]
|
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
|
login_count_text = person_row.find_element(By.XPATH, SELECTORS["person_logins"]).text
|
||||||
if int(login_count_text) == 0:
|
if int(login_count_text) == 0:
|
||||||
vorname = person_row.find_element(By.XPATH, SELECTORS["person_vorname"]).text
|
vorname = person_row.find_element(By.XPATH, SELECTORS["person_vorname"]).text
|
||||||
@@ -151,17 +148,20 @@ def process_full_job(driver, job_url):
|
|||||||
driver.get(access_code_page_url)
|
driver.get(access_code_page_url)
|
||||||
print(f" Navigiere zur Kommunikations-Seite für '{vorname}'...")
|
print(f" Navigiere zur Kommunikations-Seite für '{vorname}'...")
|
||||||
|
|
||||||
|
# GEÄNDERTER, ROBUSTER BLOCK ZUR DATENEXTRAKTION
|
||||||
|
for attempt in range(3):
|
||||||
try:
|
try:
|
||||||
# GEZIELTER TRY-BLOCK für die Interaktion auf der neuen Seite
|
# Wir warten explizit, bis die Seite die Details anzeigt (z.B. den Schnell-Login)
|
||||||
schnell_login_url = wait.until(EC.visibility_of_element_located((By.XPATH, SELECTORS["quick_login_url"]))).get_attribute('href')
|
wait.until(EC.visibility_of_element_located((By.XPATH, SELECTORS["quick_login_url"])))
|
||||||
potential_buyer_element = wait.until(EC.element_to_be_clickable((By.XPATH, SELECTORS["potential_buyer_link"])))
|
|
||||||
|
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
|
kaeufer_name = potential_buyer_element.text
|
||||||
|
|
||||||
print(f" Käufer: '{kaeufer_name}', Schnell-Login: GEFUNDEN")
|
print(f" Käufer: '{kaeufer_name}', Schnell-Login: GEFUNDEN")
|
||||||
|
|
||||||
potential_buyer_element.click()
|
potential_buyer_element.click()
|
||||||
print(f" Navigiere zur Käufer-Detailseite...")
|
|
||||||
|
|
||||||
|
print(f" Navigiere zur Käufer-Detailseite...")
|
||||||
email = wait.until(EC.visibility_of_element_located((By.XPATH, SELECTORS["buyer_email"]))).text
|
email = wait.until(EC.visibility_of_element_located((By.XPATH, SELECTORS["buyer_email"]))).text
|
||||||
print(f" FINALE ERFOLG: E-Mail gefunden: {email}")
|
print(f" FINALE ERFOLG: E-Mail gefunden: {email}")
|
||||||
|
|
||||||
@@ -171,18 +171,23 @@ def process_full_job(driver, job_url):
|
|||||||
"E-Mail-Adresse Käufer": email,
|
"E-Mail-Adresse Käufer": email,
|
||||||
"Schnell Login URL": schnell_login_url
|
"Schnell Login URL": schnell_login_url
|
||||||
})
|
})
|
||||||
except (TimeoutException, StaleElementReferenceException) as e:
|
break # Erfolg, also die Retry-Schleife verlassen
|
||||||
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
|
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
|
||||||
|
|
||||||
|
# Zurückkehren zur Album-Übersicht für die nächste Person
|
||||||
print(f" Kehre zurück zur Album-Übersicht '{album['name']}'...")
|
print(f" Kehre zurück zur Album-Übersicht '{album['name']}'...")
|
||||||
driver.get(album['url'])
|
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"])))
|
wait.until(EC.presence_of_element_located((By.XPATH, SELECTORS["person_rows"])))
|
||||||
except TimeoutException:
|
except TimeoutException:
|
||||||
print(f" Keine Personen-Daten im Album '{album['name']}' gefunden. Überspringe.")
|
print(f" Keine Personen-Daten im Album '{album['name']}' gefunden. Überspringe.")
|
||||||
|
|||||||
Reference in New Issue
Block a user