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
| Aufgabe | Automatisierbarer Teil | Menschliche Prüfung |
|---|---|---|
| Statuscodes | URL abrufen und Antwort speichern | Ziel und Ursache des Status bewerten |
| Title und Meta-Description | Vorhandensein und Inhalt extrahieren | Suchintention und Formulierung prüfen |
| Canonical | Ziel aus HTML lesen und mit URL-Liste vergleichen | fachlich gewünschte Hauptseite bestimmen |
| Sitemap | URLs lesen und gegen Crawl-Daten stellen | Aufnahme oder Entfernung begründen |
| interne Links | Quellen, Ziele und Anker erfassen | redaktionelle Relevanz bewerten |
| strukturierte Daten | JSON-LD extrahieren und validieren | sichtbaren Inhalt und Entitäten prüfen |
| API-Daten | wiederkehrend abrufen und speichern | Kennzahlen einordnen |
| Logfiles | Zeilen filtern und gruppieren | Crawl-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:
- →Welche Eingabe wird verarbeitet?
- →Welche Eigenschaft wird gemessen?
- →Welche Regel markiert einen Befund?
- →Welche Ausnahmen sind zulässig?
- →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:
- →Ist die Stichprobe für die Aussage ausreichend?
- →Ist der Befund technisch reproduzierbar?
- →Passt die Regel zum Seitentyp?
- →Liegt eine fachliche Ausnahme vor?
- →Welche Änderung folgt daraus?
- →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
▋