scrape_fotograf.py aktualisiert

This commit is contained in:
2025-07-16 19:23:10 +00:00
parent 462f41ba2b
commit 815d213304

View File

@@ -3,7 +3,7 @@ import os
import time import time
import csv import csv
import math 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 datetime import datetime
from selenium import webdriver from selenium import webdriver
from selenium.webdriver.chrome.options import Options from selenium.webdriver.chrome.options import Options
@@ -37,6 +37,7 @@ SELECTORS = {
"buyer_email": "//span[contains(., '@')]" "buyer_email": "//span[contains(., '@')]"
} }
# --- Hilfsfunktionen (unverändert) ---
def take_error_screenshot(driver, error_name): def take_error_screenshot(driver, error_name):
os.makedirs(OUTPUT_DIR, exist_ok=True) os.makedirs(OUTPUT_DIR, exist_ok=True)
timestamp = datetime.now().strftime("%Y%m%d_%H%M%S") 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") take_error_screenshot(driver, "login_error")
return False return False
# --- Hauptlogik (unverändert) ---
def process_full_job(driver, job_url): def process_full_job(driver, job_url):
wait = WebDriverWait(driver, 15) 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: 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}" settings_url = f"https://app.fotograf.de/config_jobs_settings/index/{job_id}"
except (AttributeError, IndexError): except (AttributeError, IndexError, ValueError) as e:
print(f"!!! FEHLER: Konnte keine Job-ID aus der URL '{job_url}' extrahieren.") print(f"!!! FEHLER: Konnte keine Job-ID aus der URL '{job_url}' extrahieren. Grund: {e}")
return [] return []
print(f"\nVerarbeite Job-ID: {job_id}") print(f"\nVerarbeite Job-ID: {job_id}")
@@ -242,6 +247,7 @@ def get_profile_choice():
else: print("Ungültige Auswahl.") else: print("Ungültige Auswahl.")
except ValueError: print("Ungültige Eingabe.") except ValueError: print("Ungültige Eingabe.")
# --- Finale, korrigierte main-Funktion ---
def main(): def main():
print("--- Fotograf.de Scraper für Nutzer mit wenig Logins (0 oder 1) ---") print("--- Fotograf.de Scraper für Nutzer mit wenig Logins (0 oder 1) ---")
credentials = get_profile_choice() credentials = get_profile_choice()
@@ -249,15 +255,15 @@ def main():
job_url_raw = input("Bitte gib eine beliebige URL des zu bearbeitenden Fotoauftrags ein: ") 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 # NEU: Kugelsichere URL-Extraktion mit Regex, um Terminal-Steuerzeichen zu entfernen
match = re.search(r'https?://[^\s]+', job_url_raw) match = re.search(r'(https?://[^\s]+)', job_url_raw)
if not match: if not match:
print("Keine gültige URL in der Eingabe gefunden.") print("Keine gültige URL in der Eingabe gefunden.")
return return
job_url = match.group(0) job_url = match.group(1).strip()
# NEU: Flexible Überprüfung, die jede Job-Seite akzeptiert # NEU: Flexiblere Überprüfung
if "fotograf.de/config_jobs_" not in job_url: 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.") print("Dies scheint keine gültige URL für einen Fotoauftrag zu sein.")
return return