From 9b339cc97cf66cf01d3320eb589efb78ff966566 Mon Sep 17 00:00:00 2001 From: Floke Date: Wed, 16 Jul 2025 19:23:10 +0000 Subject: [PATCH] scrape_fotograf.py aktualisiert --- scrape_fotograf.py | 28 +++++++++++++++++----------- 1 file changed, 17 insertions(+), 11 deletions(-) diff --git a/scrape_fotograf.py b/scrape_fotograf.py index daaf2824..36536a36 100644 --- a/scrape_fotograf.py +++ b/scrape_fotograf.py @@ -3,7 +3,7 @@ import os import time import csv import math -import re # NEU: Modul für reguläre Ausdrücke importieren +import re # Modul für reguläre Ausdrücke from datetime import datetime from selenium import webdriver from selenium.webdriver.chrome.options import Options @@ -37,6 +37,7 @@ SELECTORS = { "buyer_email": "//span[contains(., '@')]" } +# --- Hilfsfunktionen (unverändert) --- def take_error_screenshot(driver, error_name): os.makedirs(OUTPUT_DIR, exist_ok=True) timestamp = datetime.now().strftime("%Y%m%d_%H%M%S") @@ -96,16 +97,20 @@ def login(driver, username, password): take_error_screenshot(driver, "login_error") return False +# --- Hauptlogik (unverändert) --- def process_full_job(driver, job_url): wait = WebDriverWait(driver, 15) - # Der Job-Name wird von der Einstellungs-Seite geholt, da diese stabil ist. - # Wir konstruieren die URL aus der eingegebenen URL, egal welche es war. try: - job_id = re.search(r'/(\d+)$', job_url).group(1) + job_id_match = re.search(r'/(\d+)', job_url) + if not job_id_match: + raise ValueError("Konnte keine numerische Job-ID finden.") + job_id = job_id_match.group(1) + + # Wir konstruieren die Einstellungs-URL, um den Job-Namen zu holen settings_url = f"https://app.fotograf.de/config_jobs_settings/index/{job_id}" - except (AttributeError, IndexError): - print(f"!!! FEHLER: Konnte keine Job-ID aus der URL '{job_url}' extrahieren.") + except (AttributeError, IndexError, ValueError) as e: + print(f"!!! FEHLER: Konnte keine Job-ID aus der URL '{job_url}' extrahieren. Grund: {e}") return [] print(f"\nVerarbeite Job-ID: {job_id}") @@ -242,6 +247,7 @@ def get_profile_choice(): else: print("Ungültige Auswahl.") except ValueError: print("Ungültige Eingabe.") +# --- Finale, korrigierte main-Funktion --- def main(): print("--- Fotograf.de Scraper für Nutzer mit wenig Logins (0 oder 1) ---") credentials = get_profile_choice() @@ -249,15 +255,15 @@ def main(): job_url_raw = input("Bitte gib eine beliebige URL des zu bearbeitenden Fotoauftrags ein: ") - # NEU: Robuste URL-Extraktion mit Regex, um Terminal-Steuerzeichen zu entfernen - match = re.search(r'https?://[^\s]+', job_url_raw) + # NEU: Kugelsichere URL-Extraktion mit Regex, um Terminal-Steuerzeichen zu entfernen + match = re.search(r'(https?://[^\s]+)', job_url_raw) if not match: print("Keine gültige URL in der Eingabe gefunden.") return - job_url = match.group(0) + job_url = match.group(1).strip() - # NEU: Flexible Überprüfung, die jede Job-Seite akzeptiert - if "fotograf.de/config_jobs_" not in job_url: + # NEU: Flexiblere Überprüfung + if "fotograf.de/config_jobs_" not in job_url or not re.search(r'/\d+', job_url): print("Dies scheint keine gültige URL für einen Fotoauftrag zu sein.") return