Google bietet schon seit Längerem Webmastern die Möglichkeit die Struktur
ihrer Web-Site der Suchmaschine zu melden, damit zum Beispiel Änderungen
schneller erfasst und gefunden werden können. Zu diesem Zweck wurde das
Sitemap-Protokoll
entwickelt, dessen Basis eine maschinenlesbare XML-Datei darstellt, in dem
die einzelnen URL's einer Web-Site erfasst sind.
Das Format ist derart erfolgreich, dass Yahoo und sogar Microsoft auf den
Zug aufgesprungen sind und Ende 2006, gemeinsam mit Google, das Sitemap-Protokoll in der Version 0.9 auf
www.sitemap.org veröffentlicht haben. Dort kann man sich auch die
aktuell gültige Spezifikation ansehen.
Einreichen kann man die Sitemaps bei Google über die
Webmaster-Tools. Bei Yahoo gelingt dies über den im Beta-Status
befindlichen Yahoo Site Explorer. In beiden Fällen benötigt man bei der jeweiligen
Suchmaschine ein Konto und muss eine Verifizierungsdatei auf den eigenen
Web-Server legen. Microsoft bietet hingegen für seine Suchmaschine
search.live.com bzw. den Crawler MSNBot noch keine Möglichkeit eine Sitemap
einzureichen.
Die Sitemap-Struktur
Das Sitemap-Format ist recht simpel, denn es besteht nur aus einer
Handvoll XML-Tags und ist
ausgezeichnet dokumentiert:
<?xml version="1.0" encoding="UTF-8"?>
<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">
<url>
<loc>http://www.example.com/</loc>
<lastmod>2005-01-01</lastmod>
<changefreq>monthly</changefreq>
<priority>0.8</priority>
</url>
</urlset>
Alles beginnt mit dem Root-Tag urlset, das über das Attribut
xmlns auf den Protokollstandard verweist. Unterhalb dieses
Wurzelelements können unendlich viele url-Tags definiert
werden. Jedes einzelne stellt eine URL der zu beschreibenden Web-Site dar.
Zur näheren Beschreibung einer URL gibt es unterhalb von url
wiederum 4 Tags, die zum Teil optional sind:
| Tag |
Beschreibung |
optional |
loc |
URL der Seite |
Nein |
lastmod |
Datum der letzten Änderung |
Ja |
changefreq |
Änderungshäufigkeit (always, hourly, daily, weekly, ...) |
Ja |
priority |
Priorität gegenüber anderen URL der Web-Site |
Ja |
Das war es im Prinzip auch schon. Mit dieser Struktur, die man über
verschiedene Ebenen verschachteln kann, ist jeder Web-Master in der Lage
seine Web-Site in maschinenlesbarer Form abzubilden.
In der Praxis ist es aber eher mühsam bei jeder Änderung der
Seitenstruktur die XML-Datei anzupassen. Vor allem, wenn man eine sehr rege
genutzte Seite wie ein Blog betreibt. Aus diesem Grund bietet unter anderem
Google einen Sitemap-Generator
der einem diese Arbeit etwas erleichtern
kann. Desweiteren gibt es inzwischen zahllose freie oder kommerzielle Tools,
die eine Web-Site scannen und Sitemap-Dateien erzeugen können.
Alle diese Tools haben aber ihre Nachteile. Zum Teil sind sie, wie der
Sitemap-Generator von Google, in Sprachen wie Python geschrieben, die
zunächst die Installation von diversen Software-Paketen erfordern, oder sie
kommen nur mit starren HTML-Strukturen zurecht. Ein wirklich dynamisches
System für Datenbank-gestützte Blog-Systeme wie zerbit.de
zum Beispiel, ist mir noch nicht untergekommen.
Aus diesem Grund habe ich die Pagemap-Struktur
entwickelt, die in der Lage ist, eben auch dynamisch erzeugte Web-Site zu
beschreiben und als Basis für automatisch generierte Sitemap-Dateien dienen
kann.
Pagemap - Die Alternative für Generatoren
In einer Sitemap-Datei muss für jede zu indizierende URL ein Eintrag
vorhanden sein. Betreibt man nun beispielsweise Datenbank-gestütztes Blog
dessen Beiträge über ein und dieselbe URL, aber mit unterschiedlichen
Parametern aufgerufen werden, so müsste man, bei 20 Beitrags-Datensätzen, 20
einzelne Einträge in der Sitemap generieren.
Auf dieser Web-Site ist dies z.B. der Fall. Die einzelnen Artikel sind
u.a. über die URL http://www.zerbit.de/artikel/show.aspx?id=XXX
aufrufbar, wobei die ID für die Nummer des aus der Datenbank abzurufenden
Artikels steht. Wenn ich nun, wie gerade, einen neuen Artikel schreibe, dann
müsste ich nach der Fertigstellung entweder die Sitemap manuell ergänzen
oder einen Generator über die Site laufen lassen.
Weil ich für die Anzeige der Artikel und Beiträge schon alles weitgehend
automatisiert hatte, war es für mich nicht einzusehen, wegen der Sitemap
noch einmal Hand anzulegen. Ein Automatismus musste her; eine Definition
meiner Web-Site unter Einbeziehung der dynamisch generierten URL's...
Definition einer Datenbank-gestützten Web-Site in XML
Googles Idee eine Web-Site mit XML zu beschreiben ist ja bestechend, also
verfolgte ich diesen Ansatz, allerdings etwas hierarchischer, denn eine Site
besteht meist aus mehreren Ebenen, angefangen mit der Startseite und das ist
in einer Suchmaschinen-Sitemap nicht abbildbar. Pate für die neue Struktur stand
dabei auch
Microsofts ASP.NET Sitemap-Modell.
Mithilfe dieser XML-Struktur kann man
ASP.NET-Seiten hierarchisch beschreiben und daraus z.B. automatisch normale
Sitemaps für Webs generieren.
Eine Pagemap-XML-Struktur geht allerdings noch einen
Schritt weiter, denn in ihr können, neben starren HTML-Seiten, auch
Definitionen zu Datenbank-gestützten URL's abgelegt werden,
d.h. man definiert lediglich die Parameter für einen Datenbankzugriff und
den Rest erledigt ein Stückchen Code das die Datensätze iteriert.
Beginnen wir mit dem Wurzelelement. Die heißt schlicht pagemap und
besitzt nur ein Attribut namens site, das den Namen der Web-Site aufnimmt:
<?xml version="1.0" encoding="iso-8859-1"?>
<pagemap site="www.meinblog.de">
...
</pagemap>
Unterhalb der Wurzel können nun einzelne Seiten mithilfe des Tags page abgelegt werden:
<?xml version="1.0" encoding="iso-8859-1"?>
<pagemap site="www.meinblog.de">
<page>...</page>
<page>...</page>
...
</pagemap>
Diese Seitendefinitionen können auch gleichzeitig die Hierarchie der Site
beschreiben, wenn man sie entsprechend verschachtelt:
<?xml version="1.0" encoding="iso-8859-1"?>
<pagemap site="www.meinblog.de">
<page>...</page>
<page>
<page>...</page>
<page>...</page>
<page>
<page>...</page>
<page>...</page>
</page>
</page>
...
</pagemap>
Alle page-Tags besitzen erforderliche und optionale Attribute, die die einzelnen Seiten beschreiben:
Attribute
| Attribut |
Beschreibung |
optional |
title |
Titel der Seite |
Nein |
file |
relativer Pfad zur Seite |
Nein |
type |
Seitentyp (static, dynamic) |
Nein |
changefreq |
Änderungshäufigkeit (always, hourly, daily, weekly, monthly, yearly, never) |
Ja |
priority |
Priorität gegenüber anderen Seiten der Site (Zahl zwischen 0,0 und 1,0) |
Ja |
Dynamische Seiten (type=dynamic), geschrieben in Server-Sprachen wie ASP. ASP:NET, PHP
oder ähnlichem, besitzen neben diesen Attributen weitere Unterelemente, mit
denen die Datenbankanbindung beschrieben werden kann:
| Unterelement |
Beschreibung |
parameter |
Name des Parameters, über den die Seiten abgerufen werden (z.B. ID) |
sqlselect |
SELECT-String mit dem die Datensätze aus der Datenbank abgerufen werden (CDATA-Abschnitt) |
idfield |
Feldname des Schlüsselwertes der mit dem Übergabeparameter korrespondiert |
titlefield |
Feldname des Seitentitels |
datefield |
Feldname eines Datumsfeldes, in dem das letzte Update des Datensatzes abgelegt wird |
Die pagemap-Beschreibung eines kleines Weblog könnte dann
zum Beispiel so aussehen:
<?xml version="1.0" encoding="iso-8859-1"?>
<pagemap site="www.meinblog.de">
<page title="Startseite" file="/index.asp" type="static"
changefreq="weekly" priority="1.0">
<page title="Beiträge" file="/weblog/index.asp" type="static"
changefreq="weekly" priority="1.0">
<page file="/weblog/article.asp" type="dynamic">
<parameter>id</parameter>
<sqlselect>
<![CDATA[SELECT * FROM tblBeitraege ORDER BY LastUpdate DESC]]>
</sqlselect>
<idfield>ID</idfield>
<titlefield>TITLE</titlefield>
<datefield>LASTUPDATE</datefield>
</page>
</page>
<page title="News-Feeds" file="/rssfeeds.asp" type="static" />
<page title="Impressum" file="/impressum.asp" type="static" priority="0.1" />
<page title="Kontakt" file="/kontakt.asp" type="static" />
</page>
</pagemap>
Verarbeitung einer Pagemap
Mit dieser Struktur und mit den teils Sitemap-spezifischen Attributen ist
es nun ein leichtes eine Suchmaschinen-Sitemap zu erstellen. Zum anderen
kann man diese Site-Definition auch wunderbar dazu nutzen, eine normale,
grafische Sitemap, wie sie viele Web-Sites anbieten, automatisch zu
erzeugen. Die einzige Änderung die man manuell durchführen muss ist, wenn man
weitere statische Seite in die Site einfügt.
Die Konvertierung der Pagemap zu einer Sitemap für Google und Co.
geschieht in einer eigens dafür angefertigten ASP, ASP.NET oder PHP-Seite,
die zum einen die Informationen zu statischen HTML-Seiten und zum anderen,
mit den Datenzugriffsinformationen, iterativ alle Datensätze aus der
Datenbank in Sitemap-XML umsetzt.
(klicken zum vergrößern)Der Verarbeitungsablauf schematisch dargestellt:
Alle statischen Seiten in der Pagemap-Definition werden über eine
Hilfsfunktion direkt als XML ausgegeben. Für die dynamischen Seiten wird
zunächst Verbindung mit der Datenbank aufgenommen und dann werden alle
Datensätze einzeln über die Hilfsfunktion in XML-Markup umgesetzt.
Ein ASP-Beispiel, wie ich es für diese Web-Site verwende, gibt es weiter
unten im Abschnitt Downloads.
Erweiterungen
Wenn man die Häufigkeit der Änderungen und die Priorität für dynamische
Seiten ebenfalls ausgeben möchte, müsste die Struktur und der Ausgabe-Code
noch um die entsprechenden Definitionen der Datenbankfelder bzw. ein paar
Zeilen Code ergänzt werden. In meinem Beispiel habe ich darauf verzichtet
und übergebe der Suchmaschine lediglich das LastUpdate-Datum. Man könnte
auch allen dynamischen Seiten eines Typs eine feste Priorität zuweisen.
Ausblick
Ich werden mich demnächst daran setzen eine ASP.NET-Umsetzung
des Ausgabe-Codes einer Pagemap-Struktur zu entwickeln und sie
ebenfalls hier veröffentlichen.
Es wäre wunderbar, wenn der ein oder andere Leser, der meine Idee
aufgreift und entsprechenden Ausgabe-Code in anderen Server-Sprachen
wie PHP, Ruby oder ähnlichem schreibt, sich zwecks Veröffentlichung
hier auf der Seite mit mir in Verbindung setzt.
Downloads
Pagemap Ausgabe-Code für Sitemap-Dateien in ASP (pagemap_asp_beispiel.zip)