DEV Community

Enjyn Gruppe
Enjyn Gruppe

Posted on

Wir haben einen Website-Crawler gebaut, der 50+ Checks in einem Scan macht — kostenlos

Das Problem: Eine Website checken = 8 Tools öffnen

Als Software-Agentur prüfen wir bei Enjyn ständig Websites. Bei Erstgesprächen mit potenziellen Kunden, bei bestehenden Projekten, vor Übergaben, nach Releases. Die Frage ist immer dieselbe: Ist diese Website technisch sauber, DSGVO-konform und sicher?

Die Antwort findet sich in keinem einzelnen Tool:

Aspekt Tool das wir bisher öffneten
Performance Google PageSpeed Insights, GTmetrix
Security Headers securityheaders.com
SSL-Zertifikat SSL Labs
SEO Ahrefs / Screaming Frog / Mangools
DSGVO-Check manuell
Cookie-Banner manuell
Schema.org Google Rich Results Test
Mobile PageSpeed Mobile

Acht Tools für einen Website-Check. Jedes mit eigener UI, eigenen Bewertungslogiken, eigenen Reports. Bei zwanzig Websites am Tag ist das ein halber Arbeitstag nur fürs Hin- und Herklicken.

Wir wollten ein Tool, das alles auf einmal macht — speziell für den DACH-Markt mit DSGVO-Fokus.

Die Frage: Können wir das selbst bauen?

Bestehende All-in-One-Tools gibt es. Aber:

  • Die meisten sind englischsprachig und ignorieren deutsche Rechtsanforderungen (Impressumspflicht §5 TMG, DSGVO-Cookie-Regeln, Google Fonts Schrems II)
  • Viele sind kostenpflichtige SaaS ab 50€/Monat
  • Die kostenlosen geben nur Teil-Reports und wollen dich in einen Funnel zwingen

Was wir wollten:

  • Eine URL rein, vollständiger Report raus
  • DSGVO-zentrisch (Impressum, Datenschutz, externe Fonts, Tracking-ohne-Consent)
  • Kostenlos, ohne Registrierung
  • Objektive Bewertung — keine subjektiven Faktoren

Also haben wir uns hingesetzt und den Enjyn Crawler gebaut. Heute prüft er über 50 Faktoren in einem einzigen Scan.

Was wir prüfen — die 50+ Checks

Vier Kategorien, jede mit konkreten technischen Tests:

Sicherheit (14 Checks)

HTTPS/SSL, HSTS Header, CSP Header, X-Frame-Options, X-Content-Type, Referrer-Policy, Permissions-Policy, security.txt, Mixed Content, CSRF-Schutz, Server-Info Leakage, PHP-Version exposed, sensible Dateien (.env, .git), WP User Enumeration.

SEO (15 Checks)

robots.txt, sitemap.xml, llms.txt, Meta-Title (10-70 Zeichen), Meta-Description (50-160 Zeichen), Canonical URL, H1-H6 Struktur, Open Graph, Twitter Cards, Schema.org, Favicon, Alt-Texte, interne/externe Links, Wortanzahl.

Rechtliches/DSGVO (12 Checks)

Impressum, Datenschutzerklärung, AGB, Widerruf, Cookie-Banner, Cookie-Richtlinie, Google Fonts (Schrems II!), Google Analytics, Facebook Pixel, Tracking ohne Consent, TMG/DDG-Prüfung, Kontaktdaten.

Performance & Mobile (13 Checks)

Ladezeit, Seitengröße, GZIP/Brotli, HTTP/2, DOM-Größe, Ressourcen-Anzahl, Bilder, Scripts, Stylesheets, Third-Party Requests, Viewport, Skip-Link, ARIA Landmarks.

Der Stack — komplett offen

Im Gegensatz zum KYC-Artikel müssen wir hier nichts verstecken — der Crawler ist Open-Approach, es gibt keinen Anti-Fraud-Grund für Geheimhaltung:

Sprache: Python 3.11+
Web-Framework: Flask
HTTP-Client: httpx (statt requests — async + HTTP/2)
HTML-Parser: BeautifulSoup4 + lxml
Spracherkennung: Lingua (AI-basiert, 95%+ Genauigkeit)
Datenbank: SQLite (Scans werden temporär gespeichert)
WSGI: Gunicorn

Bewusst kein Headless Browser (Puppeteer/Playwright). Warum? Geschwindigkeit. Ein vollständiger Scan dauert bei uns 2-8 Sekunden statt 30-60 Sekunden bei Lighthouse-basierten Tools.

Das geht, weil wir bewusst nicht jedes JavaScript ausführen. Wir analysieren das gelieferte HTML, Headers und statische Assets — das deckt 95% der relevanten Probleme ab. Die fehlenden 5% (z.B. Runtime-Performance) sind genau die, für die du PageSpeed Insights eh weiter brauchst.

Beispiel: SSL-Check

So sieht der SSL-Check unter der Haube aus:

import ssl
import socket

def check_ssl(domain):
    context = ssl.create_default_context()
    with socket.create_connection((domain, 443), timeout=5) as sock:
        with context.wrap_socket(sock, server_hostname=domain) as ssock:
            cert = ssock.getpeercert()

    # Ablaufdatum extrahieren
    not_after = cert['notAfter']
    expires = datetime.strptime(not_after, '%b %d %H:%M:%S %Y %Z')
    days_left = (expires - datetime.utcnow()).days

    if days_left < 14:
        return {'status': 'critical', 'days': days_left}
    elif days_left < 30:
        return {'status': 'warning', 'days': days_left}
    else:
        return {'status': 'ok', 'days': days_left}
Enter fullscreen mode Exit fullscreen mode

Kein Hexenwerk. Nur Python-Standardbibliothek. Die meisten unserer 50+ Checks sind ähnlich straightforward — der Aufwand lag nicht im Einzelcheck, sondern im Sammeln aller Edge-Cases, die in deutschen Websites real auftreten.

Beispiel: Google Fonts Detection (Schrems II!)

Ein Check, der erst seit Schrems II 2020 wirklich wichtig ist:

def check_google_fonts(html):
    # Schrems II: Google Fonts ohne Consent = DSGVO-Verstoß
    # (LG München, Urteil vom 20.01.2022, Az. 3 O 17493/20)

    indicators = [
        'fonts.googleapis.com',
        'fonts.gstatic.com',
        '@import url\\(.*fonts\\.google'
    ]

    for pattern in indicators:
        if re.search(pattern, html, re.IGNORECASE):
            return {
                'status': 'critical',
                'reason': 'Google Fonts wird extern geladen',
                'risk': 'IP-Übertragung in die USA ohne Consent',
                'fix': 'Self-Hosting der Fonts oder Consent vor Laden'
            }

    return {'status': 'ok'}
Enter fullscreen mode Exit fullscreen mode

Das ist ein typischer Crawler-Check, den kein internationales Tool macht, weil das Rechtsproblem deutsch-spezifisch ist.

Das Scoring: eRate + eTrust

Statt eine einzige "Note" zu geben, splitten wir das Ergebnis bewusst in zwei Bewertungen:

eRate — Technische Qualität (0-100%)

Kategorie Max. Punkte
Sicherheit 30
Datenschutz & Rechtliches 25
SEO & Auffindbarkeit 25
Performance 20

eTrust — Vertrauenswürdigkeit (0-100%)

Faktor Punkte
SSL/HTTPS 15
Impressum 15
Datenschutzerklärung 12
Kontaktinformationen 10
Keine Malware-Indikatoren 10
Sichere Formulare 8
Professionelles Erscheinungsbild 8
Transparenz 7

Warum zwei Werte? Weil eine Website technisch perfekt sein kann (eRate A+), aber unseriös wirken (kein Impressum, kein Kontakt → eTrust D). Beide Aspekte sind für Besucher relevant — und werden mit nur einem Score vermischt.

Was wir bewusst NICHT machen

Keine echte Performance-Messung im Browser. Wir messen Server-Response-Time und Asset-Größen, nicht Time-to-Interactive oder Largest Contentful Paint. Dafür gibt es PageSpeed Insights — wir wollten nicht der zweite sein, sondern die anderen 95% abdecken.

Keine Penetration Tests. Wir scannen passiv. Kein Brute-Force, kein Port-Scanning, kein SQL-Injection-Test. Das wäre ohne Erlaubnis des Website-Betreibers illegal.

Keine englischsprachigen Websites. Wir erkennen die Sprache der Website automatisch (via Lingua + HTML lang-Attribut) und führen den vollständigen Scan nur für deutschsprachige Websites durch. Internationale Seiten bekommen einen reduzierten Report.

Keine Hidden-Funnel-Logic. Du bekommst den vollen Report ohne E-Mail-Adresse, ohne Signup, ohne "Premium-Features dahinter". Die Bewertung ist die Bewertung.

Das Widget — Trust nach außen tragen

Nach jedem Scan kannst du das eRate/eTrust-Widget kostenlos auf deine Website einbinden. Ähnlich wie Trustpilot, aber für objektive Technik-Kriterien statt subjektive Bewertungen:

<iframe 
  src="https://crawler.eg-core.de/widget/embed?domain=deinedomain.de"
  width="300" 
  height="150"
  frameborder="0">
</iframe>
Enter fullscreen mode Exit fullscreen mode

Wir verifizieren beim Einbetten, dass die anzeigende Domain mit der gescannten übereinstimmt — kein "Fake-A+-Badge", den jemand stehlen könnte.

Warum das was bringt: Ein automatisch generiertes, unbestechliches Vertrauenssiegel. Im Gegensatz zu kaufbaren Gütesiegeln bedeutet ein A+ hier real, dass dein technisches Setup sauber ist.

Wer das nutzt

Aktuell scannen wir mit dem Crawler intern:

  • Vor jedem Erstgespräch mit potenziellen Kunden — wir gehen vorbereitet ins Meeting
  • Nach jedem Projekt-Release als Quality Gate
  • Quartalsweise für alle Hosting-Kunden, die unser Audit-Paket gebucht haben

Extern wird er von Webentwicklern, Agenturen und einigen Datenschutzbeauftragten genutzt, um schnell Sites zu screenen. Genaue Zahlen behalten wir für uns — aber er läuft stabil und schnell genug für unseren Bedarf.

Wenn du es probieren willst

Wenn du das Widget auf deiner Website einbinden willst: nach erfolgreichem Scan bekommst du den Embed-Code direkt im Report.

Top comments (0)