HTML Scraping und Article Spinning am Praxisbeispiel [Gastbeitrag]

Hinweis: Es folgt ein Gastartikel von Pascal Landau

In der neusten Version des Article Wizards wurde ein HTML Scraper implementiert, der sich jedoch noch in der Beta-Phase befindet. HTML Scraping ist eine Funktion, die ich persönlich relativ häufig benötige und für die ich bisher immer meine eigenen, proprietären Lösungen programmiert habe.

Mit dem HTML Scraper des Article Wizards habe ich nun den Versuch gewagt, den Scraping Prozess zu standardisieren und gleichzeitig in einen komfortablen Workflow zur Weiterverarbeitung einzugliedern. Im Folgenden möchte ich deshalb die die Nutzung des Scrapers in einem vollständigen Beispiel erläutern.

Zwei Sachen vorweg

  1. Das hier beschriebene Szenario beschreibt den Aufbau eines Affiliate Projektes mit wenig Aufwand und Kosten. Das Ziel ist also die Generierung und Monetarisierung von Traffic mit einfachen Mitteln – wir wollen also kein nachhaltiges Projekt mit qualitativ hochwertigen Inhalten aufbauen!
  2. Dieser Beitrag ist lang. Das Ganze wird wie gesagt ein ausführliches real-life Beispiel. Du wirst also Zeit zum Lesen mitbringen müssen Alternativ kannst du auch die Videos am Ende schauen.

Szenario: Erstellung themenspezifischer Informationsseiten für einzelne deutsche Städte

Es gibt bestimmte Arten von Informationen, die vor allem in einem lokalen Zusammenhang interessant sind. Ein Beispiel dafür ist die Frage: „Welches Fitnessstudio ist am besten?“. Klar, die Frage kann man natürlich auch generell stellen. Aber meistens dürfte es wohl so sein, dass man wissen möchte, welches Fitnessstudio in seiner Stadt am besten ist.

Statt sich also nur auf Suchanfragen wie „Fitnessstudio“, „Bestes Fitnessstudio“, „Billiges Fitnessstudio“, etc. zu konzentrieren, kann man seine Interessentengruppe noch viel besser spezifizieren, wenn man stattdessen (auch) auf die Keywords „Fitnessstudio Hamburg“, „Bestes Fitnessstudio Hamburg“, „Billiges Fitnessstudio Hamburg“ optimiert – wobei für „Hamburg“ natürlich auch jede andere deutsche Stadt oder Gemeinde stehen kann.

Zum einen bieten diese Anfragen eine wesentlich hochwertigere Zielgruppe (wenn jemand so einen Query formuliert, dann steckt da meist auch ein Konversionsgedanke dahinter) und zum anderen ist die Konkurrenz auf Grund der genaueren Formulierung (hello Mid-Long Tail :)) geringer (vor allem in kleiner Städten, in denen man auf diese Art leicht Traffic abgreifen kann). Ist erstmal Traffic da, kann dieser entweder über Adsense oder direkte Partnerschaften mit entsprechenden Studios monetarisiert werden.

What Article Spinning can do for you

Das Problem an dieser Stelle: Für jede Stadt muss eine eigene Unterseite/Landing Page erstellt werden. Selbst wenn ich dabei nur die Städte mit über 100.000 Einwohner betrachte, komme ich bereits auf über 80 Stück (siehe Wikipedia: Liste der Großstädte in Deutschland). An dieser Stelle kommt das Article Spinning ins Spiel, denn letztendlich reicht es vollkommen aus, wenn ich einen generischen Artikel erstelle, der von Fitnessstudios handelt und auch auf dieses Key optimiert ist.

Gespinnter Text zum Keyword "Fitnessstudio"

Gespinnter Text zum Keyword „Fitnessstudio“

Moment… jetzt habe ich doch erst einen generellen Text über Fitnessstudios, ich wollte aber doch eigentlich gezielt Landing Pages für einzelne Städte erstellen? Keyword-Targeting, anyone? Richtig, und genau dafür gibt es…

… die Variablenfunktion!

Variablen sind ebenfalls ein neues Feature, das mit der neusten Version des Article Wizards ausgerollt wurde. Variablen sind quasi prädestiniert für den vorliegenden Anwendungsfall. Damit kann ich Platzhalter im Spinning Text unterbringen, die bei der Erzeugung durch konkrete Texte ersetzt werden – und diese „konkreten Texte“ sind in diesem Fall natürlich Namen von Städten.

Ich kann nun ganz einfach den Stadtnamen für jede Landing Page an strategisch wichtigen Punkten (Überschriften, Bildern, Listen, etc.) und in ausreichender Häufigkeit im Text unterbringen.

Gespinnter Text zur Keyword-Kombination "Fitnessstudio + Stadtname"

Gespinnter Text zur Keyword-Kombination „Fitnessstudio + Stadtname“

Okay, damit bekomme ich das Keyword-Targeting Problem in den Griff, aber wie bekomme ich denn die ganzen Städte als Grundlage für die Variablen in den Article Wizard, denn bisher stehen die ja nur auf Wikipedia: Liste der Großstädte in Deutschland? Berechtigte Frage.. Entweder ihr steht auf monotones Copy and Paste – oder ihr habt einen Praktikanten – oder ihr benutzt…

… den HTML Scraper!

So, wir stehen nun also vor dem Problem, dass wir Text auf einer Webseite haben und diesen in möglichst strukturierter Form extrahieren wollen. Ladies and Gentleman: Willkommen in der Welt des Scrapens.

Ermittlung der richtigen Ausdrücke

Das Ziel ist es also, alle Stadtnamen von der Tabelle unter http://de.wikipedia.org/wiki/Liste_der_Gro%C3%9Fst%C3%A4dte_in_Deutschland#Aktuelle_Gro.C3.9Fst.C3.A4dte zu extrahieren. Dazu benötigen wir zunächst einmal den entsprechenden XPath-Ausdruck, den wir mit dem Firebug Addon FirePath bekommen, indem wir auf den ersten Stadtnamen mit der rechten Maustaste klicken und im erscheinenden Kontextmenü den Punkt „Inspect in FirePath“ auswählen. Die folgende Abbildung verdeutlicht das:

Auswahl eines Stadtnamens mit FirePath

Auswahl eines Stadtnamens mit FirePath

Den Stadtnamen „Berlin“ (genauer: den a-Tag, der Berlin als Linktext besitzt) können wir also über den XPath-Ausdruck

.//*[@id='bodyContent']/div[4]/table[2]/tbody/tr[1]/td[2]/a

auswählen. Wir wollen allerdings nicht nur einen Stadtnamen, sondern alle. Deshalb muss der oben fett markierte Teil „[1]“ hinter dem tr-Tag entfernt werden. Dieser besagt nämlich, dass nur die erste Zeile (also der erste tr-Tag der Tabelle) ausgewählt werden soll. Daraus resultiert der folgende XPath-Ausdruck

.//*[@id='bodyContent']/div[4]/table[2]/tbody/tr/td[2]/a

Dieser wählt nun tatsächlich alle Stadtnamen wie gewünscht aus, wie die folgende Abbildung beweist:

Auswahl aller Städte mit FirePath

Auswahl aller Städte mit FirePath

Bevor der Ausdruck allerdings verwendet werden kann, muss noch das „tbody“ entfernt werden. Dieses wird von FireFox automatisch hinzugefügt, obwohl es im ursprünglichen Quelltext gar nicht steht (könnt ihr gern überprüfen ;)). Ist etwas tricky, aber dafür ist das hier eben auch ein real-life Beispiel. Der „richtige“ XPath-Ausdruck lautet

.//*[@id='bodyContent']/div[4]/table[2]/tr/td[2]/a

Interessanterweise sind alle Einträge in der Wiki-Tabelle mit der entsprechenden Detailseite einer Stadt verlinkt. Deshalb ziehe ich mir die jeweilige URL noch gleich mit raus. Dazu extrahiere ich den Wert des href-Attributes mittels

.//*[@id='bodyContent']/div[4]/table[2]/tr/td[2][email protected]

Achtung!
Scraping kann generell etwas tricky sein und FirePath ist eigentlich nur dann wirklich sinnvoll, wenn im Quelltext id-Attribute verwendet werden. Ansonsten ist der Pfad meist elendig lang und kann unter Umständen vom Scraper nicht richtig erkannt werden. Meist macht es dann mehr Sinn, den XPath selbst zu definieren (geht zum Beispiel über class Attribut häufig sehr gut). Das ist allerdings ein Kapitel für sich

Scraper öffnen und Text extrahieren

Da inzwischen die nötigen XPath Ausdrücke bekannt sind, muss der HTML Scraper des Article Wizards geöffnet werden. Wie das in der Beta-Version funktioniert, findet ihr im Unterpunkt Freischaltung des Scrapers. Dort werden nun die URL und die oben ermittelten Ausdrücke eingetragen. Der Index wird auf „-1“ belassen, da jedes Element extrahiert werden soll und die Extraktionsmethode selbst ist „XPath“. Insgesamt sieht das dann so wie im folgenden Screenshot aus:

HTML Scraper Einstellungen für die Wikipedia Städteliste

HTML Scraper Einstellungen für die Wikipedia Städteliste

Das war’s eigentlich schon. Statt einer halben Stunde Copy & Paste habe ich die komplette Liste in wenigen Sekunden heruntergeladen. Ich kann die Werte nun als CSV-Datei extrahieren oder direkt als Datenbasis für die Variablenfunktion des Article Wizards verwenden. Ich bin an dieser Stelle bereits soweit, dass ich meinen gespinnten Artikel auf jede einzelnen Stadt optimieren kann. Aber vorerst exportiere ich die Ergebnisse des Scrapens als CSV Datei. We’re not done yet.

Mehr HTML Scraping für höhere Qualität

Bisher haben wir lediglich eine Liste mit Stadtnamen extrahiert. In jedem einzelnen Artikel steht aber immernoch genau der selbe Inhalt. Klar, der Text ist gespinnt und damit auch „unique“ im Sinne von Google, aber ich wäre trotzdem vorsichtig, zu viele Artikel aus dem gleichen gespinnten Ausgangstext auf ein und der selben Domain zu hosten. Schließlich kann man nicht ausschließen, dass Google in Zukunft einen entsprechenden Filter einführt, der die Unterseiten der gleichen Domain noch genauer hinsichtlich Duplicate Content prüft.

Ich möchte also jedem einzelnen Artikel noch eine möglichst individuelle Note (sprich einen Teil individuellen Textes) verpassen. Dazu kann ich entweder jeden Artikel manuell editieren – was ziemlich zeitaufwendig wäre – oder ich mache mir erneut die Power des Scrapens zu Nutze. Wie ich bereits weiter oben schrieb, bietet Wikipedia zu jeder Stadt eine eigene Detailseite an. In weiser Voraussicht habe ich sogar schon die entsprechenden URLs zuvor mitgescraped, also schauen wir uns die Sache mal genauer an.

Relative in absolute URLs umwandeln

Leider handelt es sich bei den vorliegenden URLs um relative URLs, deshalb kann ich sie nicht direkt weiterverwenden sondern muss sie zuerst in absolute URLs umwandeln. Dazu kann Microsoft Excel verwendet werden, indem einfach mit der Funktion „Verketten“ der fehlende Teil der URL („http://de.wikipedia.org“) ergänzt wird. Wie das im Detail funktioniert, demonstriert der folgende Screenshot:

Relative URLs mit Hilfe von Excel auflösen

Relative URLs mit Hilfe von Excel auflösen

Die resultierenden URLs kann ich jetzt einfach komplett markieren, kopieren und als neue URLs in den Scraper einsetzen.

Informationen auf den Detailseiten scrapen

Schaut man sich die Detailseite einer Stadt auf Wikipedia an, findet man einige Informationen, die uns sehr gelegen kommen. Dazu zählen zum Beispiel:

  • Name der Stadt
  • Einleitungstext
  • Stadtwappen
  • Einwohnerzahl
  • etc.

Diese Infos habe ich am Beispiel der Detailseite von München im folgenden Screenshot markiert:

Scraping-relevante Informationen der Wiki-Seite von München

Scraping-relevante Informationen der Wiki-Seite von München

Zum Scrapen verwende ich die folgenden Ausdrücke:

Seitenbereich Ausdruck Index Methode
Stadtname .//*[@id='firstHeading'] 0 XPath
Einleitungstext .//*[@id='bodyContent']/div[4]/p[1] 0 XPath
Stadtwappen .//*[@id='Vorlage_Infobox_Verwaltungseinheit_in_Deutschland']//img[1][email protected] 0 XPath
Einwohnerzahl <td[^>]*>Einwohner:</td>\s*<td[^>]*>\s*<p>(.*?)<small> 0 Regex

Anmerkung: Der Ausdruck für das Stadtwappen wurde nicht mit FirePath sondern experimentell ermittelt. Wikipedia verwendet auf einige Detailseiten einen nicht-standardisierten Quellcode, deshalb musste ein flexiblerer Ausdruck gewählt werden.

Im Scraper sieht das Ganze dann so aus:

Detailseiten von Wikipedia scrapen

Detailseiten von Wikipedia scrapen

Wie man sehen kann, gab es bei den Städten Berlin, Bremen und Hamburg einen Fehler. Und was verbindet diese 3 Städte? Genau, das sind alles Stadtstaaten, deshalb sieht auch der HTML Quellcode der Detailseiten etwas anders als bei den restlichen Städten aus. Deshalb passe ich die Ausdrücke an und lasse die „Fehlerhaften erneut starten“:

Seitenbereich Ausdruck Index Methode
Stadtname .//*[@id='firstHeading'] 0 XPath
Einleitungstext .//*[@id='bodyContent']/div[4]/p[1] 0 XPath
Stadtwappen .//*[@id='bodyContent']/div[4]/table[2]//img[1][email protected] 0 XPath
Einwohnerzahl <td[^>]*><a[^>]*>Einwohner</a>:</td>\s*<td[^>]*>\s*(.*?)\s*<small> 0 Regex

Gescrapte Daten nachbearbeiten

Inzwischen haben wir von jeder Stadt neben dem Namen auch noch einen auf die Stadt zugeschnittenen Beschreibungstext, das Stadtwappen und die Einwohnerzahl. Theoretisch könnten wir jetzt die Landing Pages generieren. Praktisch ist es aber leider so, dass sich in dem von Wikipedia gescrapten Einleitungstext noch relativ viele interne Links verbergen. Deshalb werden die gescrapten Daten zunächst wieder als CSV Datei exportiert und „bereinigt“.

Dazu können wir zum Beispiel den Online Dienst Strip HTML Tag verwenden. Dieser entfernt alle HTML Tags aus dem eingegebenen Text. Also öffnen wir nun die exportierte CSV Datei mit dem Windows Editor (siehe Abbildung unten), kopieren den Text, fügen ihn in das Online Tool ein und betätigen den „Strip“ Button. Der daraus resultierende (HTML-freie) Text wird wiederum kopiert und in die im Windows Editor geöffnete CSV Datei eingefügt (der alte Text wird dabei durch den neuen ersetzt!) und abgespeichert.

CSV Datei im Windows Editor öffnen

CSV Datei im Windows Editor öffnen

Wenn wir ganz penibel wären, dann müsste man eigentlich jeden Einleitungstext noch einmal kontrollieren, denn zum Teil werden von Wikipedia Sonderzeichen und Sonderformatierungen (zum Beispiel für die Lautschrift und für Fußnoten) verwendet, die dazu führen, dass der Text nicht 100% sauber ist. Das sieht dann zum Beispiel so aus:

Bielefeld [‚bi?l?f?lt] (niederdeutsch Builefeld, Bielefeld, Beilefeld oder Builefeild) ist eine kreisfreie Stadt im Regierungsbezirk Detmold im Nordosten Nordrhein-Westfalens[…]

Köln?/i (amtliche Schreibweise von 1900 bis 1919 Cöln[2], […]) ist nach Einwohnern die viertgrößte, flächenmäßig die drittgrößte Großstadt Deutschlands sowie die größte Stadt Nordrhein-Westfalens.[3] Seit dem 30. Juni 2010 ist es die vierte Millionenstadt Deutschlands.[4][…]

Diese manuelle Prüfung ist dann allerdings wirklich Feinarbeit, die ich mir an dieser Stelle erspare. Jetzt müssen wir noch die bereinigten Daten als Variablen importieren und den gespinnten Artikel etwas hübscher formatieren.

Landing Pages generieren

Im Variablensetup können beliebige CSV Dateien importiert werden. Ich brauche also nur die inzwischen bereinigte CSV Datei auszuwählen und als neue Datenbasis der Variablen zu speichern.

Variablen aus CSV Datei importieren

Variablen aus CSV Datei importieren

Gespinnten Artikel formatieren

Der gespinnte Artikel muss nun noch so formatiert werden, dass die Variablen sich in den bisherigen Text einfügen. Dabei habe ich den Artikel in 4 Bereiche unterteilt:

  • Fokussierung auf die Keywords Fitnessstudio und „Stadtname“
  • Gescrapter Informationstext zur Stadt
  • Generischer Text über Fitnessstudios
  • Landkarte
Verschiedene Bereiche im gespinnten Text

Verschiedene Bereiche im gespinnten Text

Sahnehäubchen: Google Maps integrieren

Im letzten Bereich habe ich eine Karte von Google Maps integriert. Damit bekommt nochmal jede Landing Page neben dem Stadtwappen eine weitere, visuelle Note, die signalisiert „Hier bist du richtig“. Das schöne an Google Maps ist die einfache Integration durch die Anpassung von Parametern. Der Code dazu lautet wie folgt:

<iframe width="425" height="350" frameborder="0" scrolling="no" marginheight="0" marginwidth="0" src="http://maps.google.de/maps?hl=de&amp;q=Fitnessstudio+Stadtname&amp;output=embed"></iframe>

Für Stadtname wird dabei automatisch der Name der Stadt aus den Variablen eingefügt, so dass auch immer die richtige Karte für jeden Ort generiert wird. Das Ganze sieht dann beispielsweise so aus, wie im folgenden Screenshot dargestellt.

Verschiedene Bereiche im fertigen Artikel

Verschiedene Bereiche im fertigen Artikel

Zusammenfassung: HTML Scraping und Article Spinning am Praxisbeispiel

In diesem Artikel habe ich demonstriert, wie man mit dem HTML Scraper des Article Wizards in wenigen Minuten die Informationsgrundlage für themenspezifische Landing Pages organisieren kann. Weiterhin wurden diese Informationen mit Hilfe der ebenfalls neuen Variablenfunktion in einen gespinnten Text integriert, aus dem dann wiederum 80 Landing Pages mit Unique Content erzeugt wurden.

Uniqueness der gespeicherten Artikel

Uniqueness der gespeicherten Artikel

Videos: HTML Scraping und Article Spinning am Praxisbeispiel

Wie versprochen das Ganze nochmal in Video-Form:

Über den Autor

Pascal Landau hat einen Bachelor in Angewandter Informatik und betreibt mit MySEOSolution eine Webseite zum Thema SEO, auf der er regelmäßig über Neuigkeiten aus dem Bereich Suchmaschinenoptimierung berichtet. Follow him on Twitter oder Google+

 

Haben Sie Interesse an professionellen SEO-Texten oder Shop-Texten? Wir schreiben gerne hochwertige Texte für Sie!

Comments 16

    1. Post
      Author
      Kai

      Unbedenklich war das noch nie Man sollte schon wissen, was man tut und in welchem Kontext auf welcher Seite man gespinnte Texte einsetzt.

  1. Pascal Landau

    @Tamer Schreib mir mal ne Mail. Wenn die Portale von dir alle auf WordPress basieren, könnte man da wirklich was machen.

    @Graf Fit Dito. Ohne strukturierte Daten bleibt nur Copy und Paste – daran kann man aber schwer was ändern

    @Jürgen Share your results!

  2. Jürgen

    Das neue Jahr geht ja gut los. Vielen Dank für den tollen Artikel. Ich habe das Tutorial gerade 1 zu 1 nachgebaut und konnte keinen Fehler entdecken. Jetzt ein schönes Keyword rausgesucht und ab dafür …

  3. Graf Fit

    Ist ja lustig. Die Seite von Wikipedia kenn ich schon bald auswendig. Da man solche und ähnliche Daten immer wieder braucht, wäre eine DB im Backend nicht verkehrt… Zum Scrapen gibts jede Menge Möglichkeiten. Wenn die Originaldaten aber recht untrukturiert vorliegen wirds schwierig..

    @seokai: was macht die deutsche keyword-db?

  4. Pascal Landau

    @Simon Jo, bleibt halt gespinnter Text, genügt aber der „schnell und mit wenig Aufwand“-Forderung

    @Fritz Ist das bei WPRobot ne automatische Übersetzung (z.B. wie Google Translaste) oder eine API á la Textproker?

    @Silvio Wär cool, wenn du das mal probierst Hab Anfang Dezember ein neues Projekt auf Basis der oben vorgestellten Technik aufgebaut (allerdings keine Städte sondern was anderes) und überwache das grad.

    @Bastian Nope, nicht wirklich. Kenne den Artikel (natürlich, schönes DIng ;)) aber hier geht es nicht um den „lokalen“ Bezug. Das dient nur als nachvollziehbares Beispiel, an dem ich den Einsatz von Spinning demonstriert hab. Hier stehen wirklich Scraping und Spinning im Vordergrund

  5. Bastian Gauwitz

    Für sich genommen ist die technische Umsetzung elegant umgesetzt, die Idee für die Affiliate-Seiten hinterlässt aber einen Eindruck, als hätte man sich von hier mal großzügig inspirieren lassen.

  6. Fritz

    Hi Pascal,

    Danke für den sehr informativen Artikel, das macht echt lust auf mehr Content Spinning

    Kleiner Tipp für alle die Content Spinning auch bei Affiliate WordPress Installationen betreiben wollen In der neuen Version des Plugins WPRobot sind auch schon mehrere Übersetzungsdienste integriert wo man sich Content Spinning per Interface einkaufen kann und dann per Interface direkt mit Affiliatediensten abmischen kann

  7. Silvio

    Hi Pascal,

    danke, wirklich sehr schöner und ausführlicher Artikel. Und wieder mal wieder zeitlich perfekt passend. Hier liegt schon wieder ein ganzer Haufen an Expired Domains rum, die Projektiert werden wollen

    Viele Grüße,
    Silvio

  8. webSimon

    Schönes Ding. Das schöne ist, dass man das ganze noch weiter treiben kann und sich am Ende die Qualität der Seite nicht mehr großartig von manuell geschriebenen unterscheidet. In diesem Fall sieht man ja schon, dass der Text zwar kein Musterbeispiel journalistischer Qualität ist, aber einigermaßen annehmbar ist.

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind markiert *