From d2d775f41c54c32a49f0909a8a4570e3cd5d3453 Mon Sep 17 00:00:00 2001 From: Floke Date: Thu, 17 Jul 2025 09:10:24 +0000 Subject: [PATCH] =?UTF-8?q?Anpassung=20f=C3=BCr=20mehrfach=20vorkommende?= =?UTF-8?q?=20E-Mails?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ERweiterung die das Mehrfache vorkommen von E-Mails löst. --- scrape_fotograf.py | 68 ++++++++++++++++++++++++++++++++++++++++++---- 1 file changed, 62 insertions(+), 6 deletions(-) diff --git a/scrape_fotograf.py b/scrape_fotograf.py index 36536a36..a33c7bdd 100644 --- a/scrape_fotograf.py +++ b/scrape_fotograf.py @@ -218,6 +218,58 @@ def process_full_job(driver, job_url): return final_results +def aggregate_results_by_email(results): + """ + Nimmt die Liste der rohen Ergebnisse und fasst sie pro E-Mail-Adresse zusammen. + Erstellt kombinierte Felder für Kindernamen und HTML-Links. + """ + print("\nBeginne mit der Aggregation der Ergebnisse pro E-Mail-Adresse...") + aggregated_data = {} + + for result in results: + email = result['E-Mail-Adresse Käufer'] + + if email not in aggregated_data: + # Erster Eintrag für diese E-Mail + aggregated_data[email] = { + 'Name Käufer': result['Name Käufer'], + 'E-Mail-Adresse Käufer': email, + 'Kindernamen_list': [result['Name des Kindes']], + 'LinksHTML_list': [f'Fotos von {result["Name des Kindes"]}'] + } + else: + # Weiteres Kind für eine bereits bekannte E-Mail hinzufügen + aggregated_data[email]['Kindernamen_list'].append(result['Name des Kindes']) + aggregated_data[email]['LinksHTML_list'].append(f'Fotos von {result["Name des Kindes"]}') + + # Umwandlung des Dictionaries in die finale Listenform für die CSV + final_list = [] + for email, data in aggregated_data.items(): + final_list.append({ + 'Name Käufer': data['Name Käufer'], + 'E-Mail-Adresse Käufer': email, + 'Kindernamen': ' und '.join(data['Kindernamen_list']), + 'LinksHTML': '

'.join(data['LinksHTML_list']) + }) + + print(f"Aggregation abgeschlossen. {len(results)} Roh-Einträge zu {len(final_list)} einzigartigen E-Mails zusammengefasst.") + return final_list + +def save_aggregated_results_to_csv(results): + """Speichert die aggregierten Daten in einer CSV-Datei.""" + if not results: + print("\nKeine Daten zum Speichern vorhanden.") + return + os.makedirs(OUTPUT_DIR, exist_ok=True) + # Neue Spaltennamen für die aggregierte Datei + fieldnames = ["Name Käufer", "E-Mail-Adresse Käufer", "Kindernamen", "LinksHTML"] + print(f"\nSpeichere {len(results)} aggregierte Ergebnisse in '{OUTPUT_FILE}'...") + with open(OUTPUT_FILE, 'w', newline='', encoding='utf-8') as f: + writer = csv.DictWriter(f, fieldnames=fieldnames) + writer.writeheader() + writer.writerows(results) + print("Speichern erfolgreich!") + def save_results_to_csv(results): if not results: print("\nKeine Daten zum Speichern vorhanden.") @@ -249,20 +301,18 @@ def get_profile_choice(): # --- Finale, korrigierte main-Funktion --- def main(): - print("--- Fotograf.de Scraper für Nutzer mit wenig Logins (0 oder 1) ---") + print("--- Fotograf.de Scraper (mit Datenaggregation) ---") credentials = get_profile_choice() if not credentials: return job_url_raw = input("Bitte gib eine beliebige URL des zu bearbeitenden Fotoauftrags ein: ") - # 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(1).strip() - # 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 @@ -272,8 +322,12 @@ def main(): try: if login(driver, credentials['username'], credentials['password']): - all_results = process_full_job(driver, job_url) - save_results_to_csv(all_results) + # Schritt 1: Rohe Daten sammeln + raw_results = process_full_job(driver, job_url) + # Schritt 2: Daten aggregieren + aggregated_results = aggregate_results_by_email(raw_results) + # Schritt 3: Aggregierte Daten speichern + save_aggregated_results_to_csv(aggregated_results) else: print("Skript wird beendet, da der Login fehlgeschlagen ist.") finally: @@ -281,4 +335,6 @@ def main(): if driver: driver.quit() if __name__ == "__main__": - main() \ No newline at end of file + # Hier werden alle Funktionen (inklusive der eingeklappten) benötigt + # Fügen Sie hier den vollständigen Code der Hilfsfunktionen ein. + pass \ No newline at end of file