by Michael Kienzler

Veröffentlicht:

Aktualisiert:

SEO mit Python automatisieren: Prüfungen, Tests und Grenzen

Python eignet sich für wiederkehrende SEO-Aufgaben auf vielen URLs oder Datensätzen. Ein Skript ruft Statuscodes ab, liest HTML-Felder, vergleicht Sitemaps oder verarbeitet API-Daten. Es entscheidet nicht, ob ein Inhalt die Suchintention erfüllt oder fachlich stimmt.

Automatisierung spart wiederholte Handgriffe. Jede Automation verlangt Eingabe, Regel, Test, Protokoll und menschliche Auswertung.

Welche SEO-Aufgaben sich automatisieren lassen

AufgabeAutomatisierbarer TeilMenschliche Prüfung
StatuscodesURL abrufen und Antwort speichernZiel und Ursache des Status bewerten
Title und Meta-DescriptionVorhandensein und Inhalt extrahierenSuchintention und Formulierung prüfen
CanonicalZiel aus HTML lesen und mit URL-Liste vergleichenfachlich gewünschte Hauptseite bestimmen
SitemapURLs lesen und gegen Crawl-Daten stellenAufnahme oder Entfernung begründen
interne LinksQuellen, Ziele und Anker erfassenredaktionelle Relevanz bewerten
strukturierte DatenJSON-LD extrahieren und validierensichtbaren Inhalt und Entitäten prüfen
API-Datenwiederkehrend abrufen und speichernKennzahlen einordnen
LogfilesZeilen filtern und gruppierenCrawl-Muster und Ursache bewerten

Die SEO-APIs für programmatische Datenakquise behandeln Authentifizierung, Quotas und Datenspeicherung. Die Logfile-Analyse vertieft verifizierte Bots und Serverdaten.

Prüfregel vor dem Code festlegen

Eine prüfbare Automation beantwortet fünf Fragen:

  1. →Welche Eingabe wird verarbeitet?
  2. →Welche Eigenschaft wird gemessen?
  3. →Welche Regel markiert einen Befund?
  4. →Welche Ausnahmen sind zulässig?
  5. →Welche Entscheidung trifft ein Mensch danach?

„Titel länger als 60 Zeichen“ bildet keinen Fehlerbeweis. Die Zeichenlänge dient als Hinweis. Die fachliche Prüfung entscheidet, ob der Title den Seiteninhalt knapp und unterscheidbar beschreibt.

Eine URL-Liste kontrolliert abrufen

Das folgende Beispiel liest URLs aus einer Datei, ruft sie mit einem Zeitlimit ab und speichert Statuscode sowie endgültige URL. Es begrenzt die Ausführung auf dieselbe Domain und setzt einen erkennbaren User-Agent.

from csv import DictReader, DictWriter
from time import sleep
from urllib.parse import urlparse
import requests

ALLOWED_HOST = "www.example.org"
HEADERS = {"User-Agent": "ExampleTechnicalAudit/1.0 contact@example.org"}

def fetch(url: str) -> dict:
    parsed = urlparse(url)
    if parsed.scheme not in {"http", "https"} or parsed.netloc != ALLOWED_HOST:
        return {"url": url, "status": "skipped", "final_url": "", "error": "host not allowed"}
    try:
        response = requests.get(
            url,
            headers=HEADERS,
            timeout=(5, 20),
            allow_redirects=True,
        )
        return {
            "url": url,
            "status": response.status_code,
            "final_url": response.url,
            "error": "",
        }
    except requests.RequestException as exc:
        return {"url": url, "status": "error", "final_url": "", "error": type(exc).__name__}

with open("urls.csv", encoding="utf-8", newline="") as source:
    urls = [row["url"] for row in DictReader(source)]

rows = []
for url in urls:
    rows.append(fetch(url))
    sleep(0.5)

with open("results.csv", "w", encoding="utf-8", newline="") as target:
    writer = DictWriter(target, fieldnames=["url", "status", "final_url", "error"])
    writer.writeheader()
    writer.writerows(rows)

Der Code zeigt ein Lehrbeispiel. Für den Betrieb ergänzt das Team Wiederholungsregeln, zentrale Protokolle, Konfiguration und Tests.

HTML mit einem Parser lesen

Du verarbeitest HTML mit einem Parser. Beautiful Soup oder lxml lesen Elemente und Attribute zuverlässig aus.

from bs4 import BeautifulSoup

def extract_page_fields(html: str) -> dict:
    soup = BeautifulSoup(html, "html.parser")
    title = soup.title.get_text(strip=True) if soup.title else ""
    canonical = soup.select_one('link[rel="canonical"]')
    h1_values = [node.get_text(" ", strip=True) for node in soup.find_all("h1")]
    return {
        "title": title,
        "canonical": canonical.get("href", "") if canonical else "",
        "h1_count": len(h1_values),
        "h1_values": h1_values,
    }

Ein Parser sieht das übergebene HTML. Bei clientseitig erzeugten Inhalten unterscheidet sich die erste Serverantwort vom gerenderten DOM.

JavaScript-Seiten rendern nach Bedarf

Ein Browserwerkzeug wie Playwright führt eine Seite aus und liest den Zustand nach der JavaScript-Ausführung. Dieser Weg verlangt mehr Zeit und Rechenleistung.

Du setzt Rendering nach Bedarf ein. Ein Abgleich erfasst:

  • →HTML der ersten Antwort
  • →gerendertes DOM
  • →sichtbaren Hauptinhalt
  • →interne Links
  • →Statuscode und Weiterleitung

Der Hub Technisches SEO: Infrastruktur, Architektur und Jamstack ordnet Server-, statische und clientseitige Auslieferungen ein.

Sitemaps und Crawl-Daten vergleichen

Ein Skript bildet Datenmengen:

  • →URLs aus XML-Sitemaps
  • →intern verlinkte URLs
  • →erreichte URLs aus einem Crawl
  • →kanonische URLs
  • →URLs mit organischen Suchdaten
  • →bekannte Weiterleitungen und Fehler

Der Vergleich legt Lücken offen. Eine URL, die nur in einer Sitemap steht, bildet einen Prüfhinweis. Sie gilt erst als verwaiste Seite, wenn auch Crawl- und Linkprüfungen keine verweisenden Quellen finden.

APIs und Logfiles getrennt behandeln

API-Daten stammen aus einem Schnittstellen-Dienst mit Endpunkten, Rechten und Quotas. Logfiles stammen aus der eigenen Infrastruktur und protokollieren Serverantworten. Beide Quellen lassen sich über URL und Zeit verbinden, beantworten aber verschiedene Fragen.

Ein Skript speichert Herkunft und Zeitpunkt jeder Zeile. Ohne diese Daten bleibt eine spätere Prüfung unvollständig.

Tests vor dem Lauf schreiben

Tests verhindern, dass Änderungen unbemerkt Ergebnisse verfälschen.

Testfälle festlegen

Ein Test-Set bekannter Seiten enthält mindestens:

  • →eine erreichbare Seite
  • →eine Weiterleitung
  • →eine fehlende URL
  • →eine Seite ohne Title
  • →eine Seite mit mehreren H1-Überschriften
  • →eine Seite mit relativer Canonical-URL
  • →eine langsam antwortende oder fehlerhafte Quelle

Regeln getrennt testen

Du baust Abruf, Parsing und Bewertung als getrennte Funktionen. So erkennst du, ob ein Befund aus Netzwerk, HTML oder Bewertungsregel stammt.

Ausgabe vergleichen

Ein Test prüft Spalten, Datentypen und erwartete Werte. Änderungen am Schema bleiben versioniert.

Laufzeit, Grenzen und fremde Systeme respektieren

Ein Crawler erzeugt Last auf dem Zielsystem. Vor dem Lauf stehen Umfang, Rate, Zeitfenster und Ansprechpartner fest. Fremde Websites prüfst du nur mit ausdrücklicher Berechtigung und unter Beachtung ihrer Regeln.

Datenschutz und Geheimnisse schützen

Logs, URLs und API-Daten enthalten mitunter personenbezogene oder vertrauliche Angaben. Das Skript sammelt nur Daten, die die festgelegte Prüffrage verlangt.

API-Schlüssel, Tokens und Passwörter gehören nicht in den Quellcode. Ausgaben und Fehlermeldungen bleiben vor dem Teilen frei von Geheimnissen und internen Pfaden.

Aufbewahrung und Zugriff folgen Zweck und Datenart.

Ergebnisse fachlich freigeben

Automatische Regeln erzeugen Befunde. Menschen entscheiden über Maßnahmen.

Der Freigabeschritt prüft:

  1. →Ist die Stichprobe für die Aussage ausreichend?
  2. →Ist der Befund technisch reproduzierbar?
  3. →Passt die Regel zum Seitentyp?
  4. →Liegt eine fachliche Ausnahme vor?
  5. →Welche Änderung folgt daraus?
  6. →Wie wird die Änderung nach dem Deployment geprüft?

Der Human-in-the-Loop-Prozess beschreibt Rollen und Freigaben. Das Prinzip gilt auch für automatisierte technische Befunde: Das Skript liefert das Signal, die Fachperson entscheidet.

Abnahmecheck für ein SEO-Skript

  • →Frage, Datenquelle und Ziel sind dokumentiert.
  • →Eingaben werden validiert.
  • →Zugriffe sind begrenzt und berechtigt.
  • →Zeitlimits, Fehler und Wiederholungen sind behandelt.
  • →Regeln besitzen bekannte Testfälle.
  • →Ausgabe enthält Quelle, Zeitpunkt und Skriptversion.
  • →Geheimnisse und personenbezogene Daten sind geschützt.
  • →Eine Fachperson prüft Befunde und Maßnahmen.
  • →Der Betrieb meldet fehlerhafte oder veraltete Läufe.

Häufige Fragen zur SEO-Automatisierung

Kann Python einen SEO-Audit ersetzen?

Nein. Python führt technische und quantitative Prüfungen aus. Suchintention, Fachqualität, Risiko und Priorität verlangen menschliches Urteil.

Muss eine JavaScript-Seite immer mit einem Browser gecrawlt werden?

Nein. Du prüfst zuerst den Inhalt der Serverantwort. Browser-Rendering kommt hinzu, wenn wichtige Inhalte oder Links erst zur Laufzeit entstehen.

Wie viele URLs darf ein Skript parallel abrufen?

Serverkapazität, Berechtigung, Antwortzeit und Zweck bestimmen eine vertretbare Rate. Der Lauf startet klein und bleibt überwacht.

Darf ein automatischer Befund direkt eine Website ändern?

Nur wenn Regel, Test, Rechte und Rücknahmeweg dies rechtfertigen. Für inhaltliche oder weitreichende technische Änderungen ist eine fachliche Freigabe erforderlich.

Nächster Schritt

Die SEO-Strategie mit Audit und Roadmap legt fest, welche Prüfung nötig ist. OLDSCHOOLSEO übernimmt technische Analysen als Teil der Suchmaschinenoptimierung für Unternehmen.

Projektanfrage per E-Mail senden · Erstgespräch mit Sandra buchen


Sandra Krone und Michael Kienzler | Seriöse Suchmaschinenoptimierung aus Stuttgart | Seit 2018

▋
Porträt von Michael Kienzler
Über den Autor: Michael Kienzler

Michael Kienzler ist Partner und Gründer von OLDSCHOOLSEO. Seine Arbeit beginnt bei der Analyse der technischen Architektur und der Daten, um daraus die Potenziale für die redaktionelle und strategische Weiterentwicklung abzuleiten.

SEO mit Python automatisieren | OLDSCHOOLSEO