Die „Blackbox“ des SEO liegt auf Ihrem Server.
Die meisten SEO-Verantwortlichen fliegen blind. Sie verlassen sich auf Crawler von Drittanbietern (etwa Screaming Frog oder Ahrefs), die simulieren, was Google sieht. Sie schauen auf Stichprobendaten der Google Search Console (GSC), um zu erraten, was passiert.
Aber Simulation ist nicht Realität. Und eine Stichprobe ist keine Genauigkeit.
Die einzige verlässliche Datenquelle im SEO ist Ihre Server-Logdatei. Sie erfasst jede einzelne Anfrage an Ihren Server, darunter jeden Zugriff des Googlebots. Sie verrät Ihnen genau:
- Welche Seiten der Googlebot am häufigsten (und am seltensten) besucht.
- Wo Ihr „Crawl-Budget“ für nutzlose Parameter verschwendet wird.
- Welche wertvollen Seiten völlig ignoriert werden.
Traditionell war die Logfile-Analyse teuer (Enterprise-SaaS-Tools (auf Englisch) kosten ab 900 € im Monat) oder mühsam (Excel stürzt ab einer Million Zeilen ab).
Bei kōdōkalabs lösen wir das mit Python.
Dieser Leitfaden ist ein technisches Tutorial, mit dem Sie sich mit der Pandas-Bibliothek eine eigene Log-Analyse-Engine bauen. Wir bringen Sie in weniger als 50 Zeilen Code vom „Raten“ zum „Wissen“.
Teil 1: Warum Sie Logfiles nicht ignorieren dürfen
Verantworten Sie eine Website mit mehr als 5.000 Seiten (etwa E-Commerce, Verlag, B2B-SaaS), ist das Crawl-Budget ein Rankingfaktor. Google hat keine unendlichen Ressourcen. Verbraucht es sein Budget damit, Ihre Filter, 404-Seiten und Weiterleitungen zu crawlen, bleibt nichts mehr übrig, um Ihre neuen „Money Pages“ zu entdecken.
Das Phänomen der „Zombie-Seiten“
Unsere internen Daten deuten darauf hin, dass bei großen Websites 40 % der Seiten pro Monat null Crawls erhalten. Das sind „Zombie-Seiten“. Sie existieren auf Ihrer Website, aber für Google sind sie tot.
- SaaS-Tools zeigen Ihnen das nicht (sie zeigen nur, was sie gefunden haben).
- Die GSC zeigt es Ihnen nicht (sie aggregiert Daten).
- Python deckt es sofort auf.
Teil 2: Der Stack (kostenlos und leistungsstark)
Wir bilden die Funktionalität eines Enterprise-Tools für 9.000 € kostenlos nach.
- Sprache: Python 3.10+ (öffnet in einem neuen Tab)
- Bibliothek: Pandas (öffnet in einem neuen Tab) (für schnelle Datenverarbeitung).
- Bibliothek: Advertools (öffnet in einem neuen Tab) (eine großartige SEO-spezifische Bibliothek von Elias Dabbas).
- Eingabe: Ihre rohen Access-Logfiles (meist .log oder .gz von Nginx/Apache).
Teil 3: Das Tutorial (von Rohdaten zur Erkenntnis)
Hier scheitern 99 % der Marketingverantwortlichen. Sie verbringen Wochen mit der Vorlage und Minuten mit den Daten. Sie sollten 80 % Ihrer Zeit auf die Daten verwenden.
Schritt 1: Zugriff auf die Daten
Bitten Sie Ihr DevOps-Team oder Ihren Hosting-Anbieter um die „Raw Access Logs“ der letzten 30 Tage. Sie brauchen die unverarbeiteten Nginx- oder Apache-Logs.
Schritt 2: Das Parsing-Skript
Rohe Logs sind unordentliche Zeichenketten. Wir müssen sie in einen strukturierten DataFrame (eine Tabelle) überführen, damit wir Fragen an die Daten stellen können.
Wir nutzen advertools, weil es das Regex-Parsing automatisch übernimmt.
import advertools as adv
import pandas as pd
# 1. Logdatei parsen (verarbeitet das Standardformat "combined")
# und die rohe .log-Datei aus Geschwindigkeitsgründen in eine strukturierte Parquet-Datei umwandeln
adv.logs_to_df(
log_file='access.log',
output_file='logs_output.parquet',
errors_file='errors.txt',
log_format='combined'
)
# 2. Daten in Pandas laden
df = pd.read_parquet('logs_output.parquet')
# 3. Zeitstempel in ein datetime-Objekt umwandeln (entscheidend für Zeitreihenanalysen)
df['datetime'] = pd.to_datetime(df['datetime'], format='%d/%b/%Y:%H:%M:%S %z')
print(f"Total Requests Loaded: {len(df)}")
Schritt 3: Nach dem Googlebot filtern
Das Internet ist voller Rauschen (Scraper, Nutzerverkehr, schädliche Bots). Uns interessiert nur der VIP: der Googlebot. Achtung: Verlassen Sie sich nicht allein auf den User-Agent-String (er lässt sich fälschen). In einer Produktivumgebung sollten Sie die IP-Adresse mit Googles Liste abgleichen. Für dieses Tutorial filtern wir der Einfachheit halber nach dem User-Agent.
# Filter für Googlebot-User-Agents erstellen
googlebot_filter = df['user_agent'].str.contains('Googlebot', case=False, na=False)
# Einen sauberen DataFrame nur mit Googlebot-Zugriffen erstellen
google_df = df[googlebot_filter].copy()
print(f"Total Googlebot Hits: {len(google_df)}")
KI-generiert Bild
Teil 4: Die Analyse (die richtigen Fragen stellen)
Mit sauberen Daten können wir die strategischen Fragen beantworten, die SEO-Umsatz bringen.
Analyse A: Verteilung der Statuscodes (der Gesundheitscheck)
Treffen Bots auf 200er (Erfolg), oder laufen sie in 301er (Weiterleitungen) und 404er (Fehler)?
# Statuscodes zählen
status_counts = google_df['status'].value_counts()
print(status_counts)
# Prozentanteile berechnen
status_percent = google_df['status'].value_counts(normalize=True) * 100
print(status_percent)
Strategische Erkenntnis:
- Liegt 3xx über 10 %: Sie haben Weiterleitungsketten, die Budget verschwenden.
- Liegt 4xx über 5 %: Sie schicken Google in Sackgassen. Beheben Sie diese Links sofort.
- Liegt 5xx über 1 %: Ihr Server ist instabil, wenn Google zu Besuch kommt. Das ist ein kritischer Notfall für Ihr Ranking.
Analyse B: Meistgecrawlte Bereiche (der Prioritätencheck)
Google zeigt Ihnen, was es für wichtig hält, indem es dort seine Zeit verbringt. Sehen wir, welche Ordner die meiste Zuwendung bekommen.
# Den ersten Ordner aus dem URL-Pfad extrahieren
google_df['folder'] = google_df['request'].str.split('/').str[1]
# Zugriffe pro Ordner zählen
folder_counts = google_df.groupby('folder').size().sort_values(ascending=False)
print(folder_counts.head(10))
Strategische Erkenntnis:
- Bekommt Ihr /blog/ 80 % des Crawlings, bringt aber nur 5 % des Umsatzes?
- Wird Ihr Ordner /products/ ignoriert?
- Maßnahme: Dominieren wenig wertvolle Ordner, sperren Sie sie in der robots.txt oder verbessern Sie die interne Verlinkung zu den wertvollen Ordnern.
Analyse C: „Zombie-Seiten“ identifizieren
Das ist das entscheidende Skript. Wir vergleichen „alle bekannten Seiten“ (aus Ihrer Sitemap) mit den „gecrawlten Seiten“ (aus den Logs). Voraussetzung: Laden Sie Ihre XML-Sitemap als CSV oder Liste herunter.
# Sitemap-URLs laden
sitemap_urls = pd.read_csv('sitemap_urls.csv')['url'].tolist()
# Eindeutige, von Google gecrawlte URLs ermitteln
crawled_urls = google_df['request'].unique().tolist()
# Die Differenz bilden (Seiten in der Sitemap, aber NICHT in den Logs)
zombie_pages = set(sitemap_urls) - set(crawled_urls)
print(f"Total Pages in Sitemap: {len(sitemap_urls)}")
print(f"Total Pages Crawled: {len(crawled_urls)}")
print(f"Zombie Pages (Zero Crawls): {len(zombie_pages)}")
# Zombies als CSV für das Content-Team exportieren
pd.DataFrame(list(zombie_pages), columns=['url']).to_csv('zombie_pages.csv', index=False)
Strategische Erkenntnis:
- Eine Zombie-Seite hat keine Chance, zu ranken oder im Index aktualisiert zu werden.
- Maßnahme: Prüfen Sie die interne Verlinkung. Hat diese Seite keinen einzigen eingehenden Link? Nehmen Sie sie in Ihren „Interlinking-Agent“-Workflow auf.
Teil 5: Fortgeschrittene „Crawl-Velocity“-Analyse
Für News-Seiten oder Publisher mit hoher Frequenz ist entscheidend, wie schnell Google neue Inhalte entdeckt. Wir können das Crawling-Pendant zur „Time to First Byte“ berechnen.
# Daten stündlich neu abtasten, um Trends der Crawl-Frequenz zu sehen
hourly_crawl = google_df.set_index('datetime').resample('H').size()
# Darstellen (erfordert matplotlib)
import matplotlib.pyplot as plt
hourly_crawl.plot(title="Googlebot Hits Per Hour", figsize=(12, 6))
plt.show()
Sehen Sie massive Ausschläge, bringen Sie sie mit Ihren Deployments in Zusammenhang. Hat ein neuer Code-Push einen Re-Crawl ausgelöst? Oder hat ein Serverfehler einen Einbruch verursacht?
Teil 6: Die Pipeline automatisieren
Einmalig ist das ein Audit. Täglich ist es DevOps. Bei kōdōkalabs verpacken wir dieses Skript in einen Docker-Container und führen es jeden Montagmorgen aus.
- Cronjob: Holt die Logs aus AWS S3.
- Skript: Führt die Analyse aus.
- Alerting: Liegt die Zombie_Rate über 30 % oder die Error_Rate über 5 %, geht ein Slack-Alert an den Kanal für Technical SEO.
So wechseln Sie von „reaktivem SEO“ (Probleme beheben, nachdem der Traffic eingebrochen ist) zu „proaktivem SEO“ (Probleme beheben, bevor Google sich dafür interessiert).
Teil 7: Der „kōdōkalabs“-Vorteil
Warum teilen wir diesen Code? Weil ein Werkzeug zu besitzen nicht dasselbe ist, wie eine Strategie zu haben. Zu wissen, dass Sie 4.000 Zombie-Seiten haben, ist Schritt eins. Zu wissen, welche davon bereinigt, welche zusammengeführt werden sollten und welche eine Schema-Ergänzung brauchen, ist der Punkt, an dem der menschliche Stratege ins Spiel kommt.
Vertrauen Sie Ihre Logfiles einer Tabellenkalkulation an?
Oder wollen Sie Ihr Crawl-Budget gezielt steuern? Technical Log Analysis Audit buchen
