SEO Heist – Automatisierte Konkurrenzanalyse mit lokalen LLMs
In der Welt der Suchmaschinenoptimierung (SEO) ist die Analyse der Konkurrenz oft der Schlüssel zum Erfolg. Zu verstehen, warum eine bestimmte Seite gut rankt und welche Keywords sie verwendet, ist essenziell. Dieses Projekt, das ich “SEO Heist” nenne, ist ein Python-Skript, das diesen Prozess automatisiert. Es nutzt moderne Web-Scraping-Techniken in Kombination mit lokalen Large Language Models (LLMs), um Inhalte zu analysieren und darauf basierend neue, optimierte Artikel zu erstellen.
Anstatt manuell Quellcodes zu durchsuchen oder teure SEO-Tools zu abonnieren, erledigt dieses Skript die Schwerarbeit lokal und kosteneffizient.
Wofür ist dieses Tool nützlich?
Dieses Tool richtet sich an Content-Creator und SEO-Spezialisten, die ihren Workflow beschleunigen möchten.
- Konkurrenzanalyse: Es lädt Webseiten herunter und extrahiert den Hauptinhalt, selbst wenn dieser hinter komplexem HTML versteckt ist.
- Keyword-Extraktion: Ein LLM analysiert den Text und identifiziert die relevantesten Keywords und Themenbereiche.
- Content-Generierung: Basierend auf den gefundenen Strukturen und Keywords erstellt das Tool einen Entwurf für einen neuen, verbesserten Artikel (Skyscraper-Technik).
- Datenschutz & Kosten: Da es mit lokalen LLMs (via LM Studio) arbeitet, verlassen keine Daten den eigenen Rechner und es fallen keine API-Kosten an.
Hauptmerkmale (Key Features)
- Stealth Scraping: Verwendet
undetected-chromedriver, um Bot-Erkennungsmechanismen zu umgehen und Seiten wie ein echter Browser zu laden. - Intelligente Inhaltserkennung: Anstatt CSS-Selektoren hart zu codieren, analysiert das LLM die HTML-Struktur und entscheidet dynamisch, wo der Haupttext zu finden ist.
- Token-Optimierung: Bereinigt HTML-Code von unnötigem Ballast (Skripte, Styles), um das Kontext-Fenster des LLMs effizient zu nutzen.
- Caching-System: Speichert heruntergeladene Seiten lokal (basierend auf einem MD5-Hash der URL), um unnötige Netzwerkanfragen zu vermeiden und die Entwicklung zu beschleunigen.
- Vollständige Pipeline: Von der URL bis zum fertigen Markdown-Artikel-Entwurf in einem Durchlauf.
Verwendete Technologien
- Sprache: Python 3
- Web Automation:
undetected-chromedriver(eine modifizierte Version von Selenium) für das Rendering von JavaScript-lastigen Seiten. - Parsing:
BeautifulSoup4für die HTML-Verarbeitung und Bereinigung. - KI-Integration: REST-API-Kommunikation mit einem lokalen LLM-Server (z.B. LM Studio), kompatibel mit OpenAI-Chat-Completions-Format.
- Datenverarbeitung:
hashlibfür Caching-Strategien undjsonfür den Datenaustausch.
Technische Highlights und Lösungsansätze
Dynamische Selektor-Ermittlung durch KI
Problem: Jede Webseite ist anders aufgebaut. Ein starrer Scraper, der nach <div class="content"> sucht, scheitert oft.
Lösung: Das Skript sendet eine bereinigte, gekürzte Version des HTML-Gerüsts an das LLM mit der Aufgabe: “Identifiziere den CSS-Selektor, der den Hauptartikel umschließt”. Das LLM fungiert hier als intelligenter Parser, der semantisch versteht, wo der Content liegt. Dies macht das Tool extrem flexibel gegenüber verschiedenen Webseiten-Layouts.
Effizientes Token-Management
Problem: LLMs haben ein begrenztes Kontext-Fenster (Context Window). Rohes HTML ist voller Rauschen (JavaScript, CSS, SVG), das wertvolle Token verschwendet und das Modell verwirren kann.
Lösung: Vor der Analyse durchläuft das HTML eine strenge Reinigungsphase (clean_html_for_analysis). Tags wie <script>, <style>, <nav> und <footer> werden entfernt. Nur das strukturelle Skelett des <body> wird an die KI gesendet. Dies reduziert die Token-Anzahl drastisch und verbessert die Qualität der KI-Antworten.
Robuste Browser-Automatisierung
Problem: Viele moderne Seiten blockieren einfache requests oder Standard-Selenium-Bots.
Lösung: Durch den Einsatz von undetected-chromedriver wird ein echtes Chrome-Profil simuliert. Das Skript erstellt temporäre Benutzerprofile, um Konflikte mit laufenden Browser-Instanzen zu vermeiden, und wartet intelligent auf das Laden der Seite, bevor der Quellcode extrahiert wird.
Ein konkretes Beispiel: Analyse eines Golf-Blogs
Um die Arbeitsweise des Tools zu verdeutlichen, hier ein gekürzter Konsolen-Output eines echten Durchlaufs. Ziel war es, einen Artikel über Golf-Etikette zu analysieren und basierend darauf neuen Content zu generieren.
Downloading page: https://www.adidas.de/blog/golfregeln-fur-die-etikette-auf-dem-grun
Starting undetected-chromedriver...
Saved to cache: page_cache\aabf6112ef2a5db7e571350a68ce733f.html
[Content Extraction] Analyzing HTML structure...
Sending request to LLM...
LLM identified selector: div._article-body_1onw8_209
Extracted 4033 characters.
[Summarization] Generating summary...
SUMMARY:
**Kurzfassung: Golf‑Etikette & Platzregeln**
| Thema | Kernaussagen |
|-------|---------------|
| **Allgemeines** | Golf ist ruhiges Naturspiel... |
[Keyword Extraction] Extracting keywords...
KEYWORDS:
### Einführung in Golfetikette
Keywords: Golfetikette Regeln, Ruhe auf dem Grün, Stressfreies Putten...
[Content Generation] Creating new blog article...
NEW ARTICLE:
# Einführung in Golfetikette
Golf ist mehr als nur ein Sport – es ist eine Kunstform...
Schritt-für-Schritt Erklärung des Prozesses
-
Download & Caching: Das Skript lädt die URL
.../golfregeln-fur-die-etikette.... Da die Seite JavaScript benötigt, fährtundetected-chromedriverhoch. Das Ergebnis wird sofort als Hash (aabf61...) gespeichert, sodass bei erneuten Tests kein neuer Request nötig ist. -
Intelligente Extraktion: Hier zeigt sich die Stärke des LLMs. Anstatt dass ich manuell im Browser-Inspektor suchen muss, erkennt die KI den kryptischen Selektor
div._article-body_1onw8_209. Dies ist typisch für moderne Frameworks (wie React oder Vue), die Klassennamen generieren. Ein klassischer Scraper wäre hier gescheitert. -
Zusammenfassung: Der extrahierte Text (über 4000 Zeichen) wird an das lokale Modell gesendet, das eine strukturierte Zusammenfassung erstellt. Dies dient als erster Check, ob der richtige Inhalt gefunden wurde.
-
Keyword-Extraktion: Das Tool analysiert die Struktur des Originalartikels und extrahiert für jeden Abschnitt relevante Keywords (z.B. “Stressfreies Putten”, “Golfetikette Regeln”). Diese bilden das Gerüst für den neuen Artikel.
-
Content-Generierung: Im letzten Schritt fungiert das LLM als Texter. Es nimmt die extrahierten Keywords und die Struktur und schreibt einen komplett neuen Blogpost (“Einführung in Golfetikette”), der thematisch deckungsgleich, aber im Wortlaut einzigartig ist.