500 B2B-Leads in einer Woche generiert — legal, mit KI, ohne LinkedIn-Scraping
Ja, es geht. Nein, es ist kein LinkedIn-Bot. Öffentliche Register, Firmen-Webseiten, saubere Anreicherung — hier der Workflow mit echten Zahlen und den drei rechtlichen Linien die ich nie überschritten habe.
Quelle: Handelsregister des Bundes
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 der Workflow den ich für einen Kunden (B2B-SaaS für deutsche Mittelständler) im März 2026 aufgebaut und produktiv laufen habe. 500 qualifizierte Leads in einer Woche, rechtlich sauber, inklusive Anreicherungs-Daten die das Sales-Team tatsächlich nutzt.
Das Ziel — Scope präzise definieren
Der Kunde wollte: 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 ich nicht genutzt habe: 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 ich 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
Python-Script das 1000 Firmen pro WZ-Kategorie 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: ~3000 Roh-Firmen 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 in ~85 Prozent der Fälle beim ersten Anlauf.
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 Firmen-Größe nutze ich eine Kombination: Wikipedia-Artikel bei größeren Namen, XING-Firmenprofil-Scraping (die öffentlichen Seiten), eigene Heuristiken über Webseiten-Merkmale (wer zeigt 20+ Team-Mitglieder 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 — ich verifiziere nicht durch Testmail, das wäre schon wieder kritischer).
Finale Liste: 500 qualifizierte B2B-Leads mit validierten Daten.
Die Zahlen nach einer Woche
| Schritt | Zeit aufwand | Output | |---|---|---| | Branchen-Definition mit Kunde | 2h | 4 Ziel-WZ-Codes | | Handelsregister-Extraktion | 8h (über 3 Tage verteilt) | 3200 Roh-Firmen | | Webseiten-URL-Findung | 4h (Batch-Jobs) | 2850 erfolgreich | | 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 |
Gesamt: ~29 Stunden Arbeitszeit über 7 Tage verteilt. Viel davon lief parallel während ich anderes gemacht habe.
Kosten: ~40 € API-Kosten für Claude + Suchanfragen + Hetzner-VM für die Scheduled Jobs.
Die drei Linien die ich nicht überschritten habe
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.
Dritts — keine automatisierten Cold-E-Mails. Die 500 Leads 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.
Was nicht klappt hat
- 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.
Wie wir diesen Artikel geprüft haben
- Tests am
- Woche vom 2026-03-24 bis 2026-03-31, für einen echten Kundenauftrag
- Hardware
- MacBook Pro M3 Max, Hetzner VM für Scheduled Jobs
- Software
- Python 3.12, Claude Haiku + Opus via API, Playwright für Webseiten-Rendering, DuckDuckGo-Search-API
- KI-Einsatz
- Claude Haiku für Kategorisierung und Anreicherung, Opus für Entscheidungs-Kanten. Kein automatisches Outreach — nur Daten-Aufbereitung.