Was dieser Artikel nicht ist
Es gibt online ungefähr 3000 Artikel und YouTube-Videos mit dem Titel "Lead-Gen mit KI." Die meisten enden in einem der folgenden Szenarien:
- LinkedIn-Automatisierungs-Tools die nach zwei Wochen gebannt werden
- E-Mail-Scraper die IP-Blacklists produzieren
- "Tools" die im Hintergrund gegen DSGVO verstoßen und deine Kunden in die Haftung bringen
Das hier ist keins davon. Das hier ist ein durchgängiger, rechtlich sauberer Workflow, um aus öffentlichen Quellen qualifizierte B2B-Leads zu gewinnen — ohne LinkedIn, ohne Grauzonen-Tools. Als roten Faden nehmen wir ein konkretes Zielprofil (B2B-SaaS für deutsche Mittelständler) und rechnen die Größenordnungen ehrlich durch.
Hinweis zu den Zahlen: Die Aufwands- und Ergebnis-Werte weiter unten sind realistische Schätzungen für dieses Ziel-Setup, keine gemessenen Werte aus einem konkreten Einzelauftrag. Deine Zahlen hängen stark von Branche, Filter und Datenqualität ab.
Das Ziel — Scope präzise definieren
Nehmen wir ein typisches Zielprofil: deutsche Mittelständler mit 20-200 Mitarbeitern im DACH-Raum, in bestimmten Branchen (Maschinenbau, Metallverarbeitung, spezialisierter Handel), mit E-Mail-Kontakt zur Geschäftsführung oder IT-Leitung.
Das ist kein "jede Firma." Das ist spezifisches Targeting. Und das ist der erste Schlüssel — je enger dein Filter, desto besser die Ergebnisse und desto weniger rechtliche Grauzone.
Die Datenquellen — alles öffentlich
Drei Haupt-Quellen, alle legal zugänglich, alle bewusst ohne LinkedIn:
1. Handelsregister des Bundes
Seit August 2022 ist der Abruf aus dem Handelsregister kostenlos (vorher 4,50 € pro Auszug). Das ist der Goldstandard für deutsche Firmendaten.
Was du bekommst: Firmennamen, Rechtsform, Sitz, Geschäftsführung, Handelsregisternummer, oft auch Geschäftszweck. Das ist extrem valide weil es aus amtlichen Quellen kommt.
Nicht drin: E-Mail-Adressen, Telefonnummern, Mitarbeiterzahlen.
2. Firmenwebseiten (die Firmen selbst)
Jede Firma hat eine Webseite, und jede Webseite hat ein Impressum. Im Impressum stehen alle Pflichtangaben nach TMG / DDG (Digitale-Dienste-Gesetz): Firmenname, Anschrift, Geschäftsführung, Handelsregister, E-Mail, Telefon.
Eine Firma die sich beschwert, dass du ihre Impressums-Daten liest, hat einen rechtlichen Problem-Fall — nicht du. Das Impressum ist explizit zum Kontaktiert-Werden da.
3. Anreicherungs-Quellen
Für Mitarbeiter-Zahlen und Branchen-Einordnung: öffentliche Statistikportale, Wikipedia bei größeren Firmen, offene XING-Firmenprofile (die publik sind, nicht Scraping hinter Login).
Was hier bewusst außen vor bleibt: LinkedIn-Scraping, Hunter.io/Apollo.io, E-Mail-Permutations-Tools, Cold-Data-Dumps von dubiosen Anbietern.
Die Pipeline — Schritt für Schritt
Schritt 1 — Branchenliste generieren
Die WZ-2008-Codes (Wirtschaftszweig-Klassifikation des Statistischen Bundesamts) sind die offizielle Branchen-Taxonomie. Für "Maschinenbau" ist das z.B. 28.xx, "Metallverarbeitung" 25.xx.
Mit diesen Codes kann man im Handelsregister gezielt filtern. Die Handelsregister-API gibt für einzelne Anfragen das direkt raus, aber für Batch-Operationen nutzt man den Common Register Portal der EU (BRIS / EBR).
Schritt 2 — Firmenliste aus Handelsregister
Ein Python-Script, das pro WZ-Kategorie Firmen zieht:
import requests
from bs4 import BeautifulSoup
import time
def fetch_firms_by_branche(wz_code, page=1):
# Handelsregister-Portal hat APIs und HTML-Scraping-Endpoints
# Hier vereinfacht, die echte Implementierung braucht Respekt vor Rate-Limits
url = f"https://www.handelsregister.de/rp_web/search-advanced.xhtml"
params = {"wz": wz_code, "page": page, "size": 100}
response = requests.get(url, params=params, headers={"User-Agent": "Research-Bot 1.0"})
# Parse HTML, extract firm details
return parse_handelsregister_response(response.text)
# Rate-Limit respektieren: max 1 Request pro 2 Sekunden
for wz in ["28.21", "28.22", "25.11", "25.21"]:
firms = []
for page in range(1, 11):
firms.extend(fetch_firms_by_branche(wz, page))
time.sleep(2)
Rate-Limiting ist nicht optional. Respekt gegenüber öffentlichen Services — und Selbstschutz, weil Scraping mit zu viel Gas zu temporären IP-Sperren führt.
Ergebnis dieses Schritts: eine Roh-Firmenliste mit Namen, Sitz, Geschäftsführung.
Schritt 3 — Webseiten-URL finden
Das Handelsregister gibt keine URLs. Also:
# Claude Haiku hilft hier: Firmenname + Sitz → wahrscheinliche URL
import requests
def find_firm_website(firm_name, city):
# DuckDuckGo Search (hat öffentliche API)
query = f'"{firm_name}" {city} impressum'
r = requests.get(f"https://api.duckduckgo.com/?q={query}&format=json")
# Erste drei Treffer nehmen, eigenes Filter-Script prüfen
results = r.json()["RelatedTopics"][:3]
return results
Claude Haiku kriegt die Liste der drei Treffer und entscheidet welche wahrscheinlich die Firmen-Webseite ist (statt z.B. ein Branchen-Verzeichnis-Eintrag). Das funktioniert erfahrungsgemäß in den meisten Fällen beim ersten Anlauf — der Rest fällt in eine manuelle Nachkontrolle.
Schritt 4 — Impressum parsen
Playwright rendert die Webseite (weil viele Seiten JavaScript-generiert sind), sucht das Impressum (meist unter /impressum, /imprint, /kontakt), extrahiert die Pflichtangaben.
from playwright.async_api import async_playwright
async def scrape_impressum(url):
async with async_playwright() as p:
browser = await p.chromium.launch()
page = await browser.new_page()
await page.goto(url + "/impressum", timeout=15000)
content = await page.content()
await browser.close()
# Claude Haiku parst das HTML und extrahiert strukturiert
return parse_with_claude(content)
Der Claude-Prompt für die Extraktion:
"Hier ist das HTML eines deutschen Firmen-Impressums. Extrahiere bitte als JSON:
- firmenname_exakt (wie im Impressum geschrieben)
- geschaeftsfuehrung (Liste von Namen)
- email_generell
- email_specific (z.B. info@, kontakt@, ceo@)
- telefon
- handelsregister_nummer Wenn eine Info nicht im Impressum steht, gib null zurück."
Schritt 5 — Anreicherung mit Mitarbeiterzahl und weiteren Daten
Für die Firmen-Größe eignet sich eine Kombination: Wikipedia-Artikel bei größeren Namen, XING-Firmenprofile (die öffentlichen Seiten), eigene Heuristiken über Webseiten-Merkmale (wer 20+ Team-Mitglieder zeigt, hat wahrscheinlich 50+ Mitarbeiter).
Claude Opus hilft hier beim Zusammenführen unterschiedlicher Signale zu einer fundierten Schätzung.
Schritt 6 — Dedup und Qualitätskontrolle
Duplikate (dieselbe Firma unter unterschiedlichen Schreibweisen) raus. E-Mails verifizieren (nur formell — eine Verifikation per Testmail wäre schon wieder kritischer und gehört nicht in die Datenaufbereitung).
Am Ende steht eine bereinigte Liste qualifizierter B2B-Leads mit validierten Daten.
Realistische Größenordnung des Aufwands
Die folgende Tabelle ist eine illustrative Schätzung für das oben skizzierte Zielprofil — kein gemessener Einzelauftrag. Sie zeigt, wo die Zeit hingeht und wie stark sich die Rohmenge durch jeden Filterschritt verkleinert:
| Schritt | Zeitaufwand (ca.) | Output (Größenordnung) | |---|---|---| | Branchen-Definition | 2h | 4 Ziel-WZ-Codes | | Handelsregister-Extraktion | 8h (über mehrere Tage) | ~3200 Roh-Firmen | | Webseiten-URL-Findung | 4h (Batch-Jobs) | ~2850 gefunden | | Impressum-Parsing | 6h | ~2100 vollständige Datensätze | | Anreicherung | 4h | ~2100 mit Größenschätzung | | Filterung auf 20-200 MA | 2h | ~680 passende | | Dedup + Qualität | 3h | ~500 finale Leads |
Grobe Größenordnung: ~29 Stunden Arbeit, davon viel als unbeaufsichtigte Batch-Jobs, plus etwa 40 € API- und Infrastruktur-Kosten (Claude-API, Suchanfragen, eine kleine VM für die Scheduled Jobs). Die konkreten Werte schwanken je nach Branche und Datenlage deutlich — nimm sie als Anhaltspunkt, nicht als Versprechen.
Die drei Linien, die man nicht überschreiten sollte
Erstens — kein LinkedIn-Scraping. LinkedIn hat klare Nutzungsbedingungen gegen automatisiertes Abziehen von Daten. Auch wenn rechtlich umstritten: Die Plattform banned dich, die Accounts deiner Kunden sind in Gefahr, und das hiQ-Labs-vs-LinkedIn-Urteil aus den USA gilt in Deutschland nicht 1:1.
Zweitens — keine E-Mail-Permutations-Tools. "firstname.lastname@company.com" ist ein verbreitetes Muster. Aber Tools die tausende solcher Permutationen testen um zu sehen welche existieren, erzeugen spam-ähnliches Verhalten das Mail-Server zurecht blockieren. Außerdem rechtlich: Du behandelst Personendaten die du nicht rechtmäßig erhoben hast.
Drittens — keine automatisierten Cold-E-Mails. Eine Lead-Liste zu haben ist noch kein Outreach. Die anschließende Kommunikation braucht eigene rechtliche Würdigung. In Deutschland ist Cold-E-Mail im B2B-Bereich in engen Grenzen erlaubt (§ 7 UWG — Handwerker darf sich beim Maschinenbauer melden weil geschäftlicher Bezug), aber nicht pauschal.
Der Artikel zu konkreten Outreach-Strategien mit KI kommt separat. Und: Dies ist kein Rechtsrat — bei Unsicherheit gehört der konkrete Fall vor eine Fachanwältin oder einen Fachanwalt für IT-/Datenschutzrecht.
Was nicht sauber klappt
- Bayerisches Unternehmensregister ist teilweise anders strukturiert als das bundeseinheitliche — erfordert eigenes Parsing
- Sehr kleine Firmen (unter 10 Mitarbeiter) sind oft keine juristischen Personen und erscheinen nicht im Handelsregister — die fallen raus
- Bestimmte Branchen (freie Berufe, Handwerk) sind oft Personengesellschaften und nicht immer im HR — für die braucht man die Handwerkskammer-Register, die wieder anders strukturiert sind
Wer profitiert von so einem Ansatz
- B2B-SaaS-Firmen mit klarem Ideal-Customer-Profile
- Agenturen und Beratungen die spezifische Branchen ansprechen
- Industrie-Zulieferer die Hersteller-Firmen erreichen wollen
Nicht empfohlen für:
- Massen-Akquise ohne klaren Fit (das scheitert immer)
- Privatkunden-Geschäft (das ist ganz andere Datenlage + rechtliche Situation)
- Hyperregional mit sehr kleinen Firmen (besser: persönliche Akquise)
Weiterlesen
Für die anschließende Outreach-Phase: Outreach-Copy mit Claude — 4 Templates. Für die DSGVO-Grenzen im Detail: DSGVO beim B2B-Scraping. Für konkrete Automation-Setups die du kennen solltest wenn du selbst Lead-Gen betreibst: n8n plus KI für Mittelständler.
Eigener Lead-Gen-Use-Case im Bau? Zone "Lead-Gen & B2B" im Discord. Konkrete Fälle, nicht allgemeines Geschwätz.





