Prüfen von toten Links mit einem eigenen Crawler in PHP

Suchmaschinenoptimierung (SEO) ist für viele Unternehmen und Webseitenbetreiber ein wichtiger Bestandteil des Online-Marketings. Ein wichtiger Faktor für eine gute Platzierung in den Suchergebnissen ist die Qualität der Links auf der eigenen Webseite. Dazu gehört auch die Prüfung auf tote Links, da diese negativ für das Ranking und die Nutzererfahrung wirken können.

Die Klasse WebCrawler bietet eine einfache Möglichkeit, um eine Webseite automatisch auf tote Links zu überprüfen und somit das SEO-Ranking zu verbessern oder auch einfach die Qualität der Seite zu erhöhen.

Der Code liegt hier als Gist vor.

Aufbau der Klasse

Die Klasse WebCrawler besteht aus verschiedenen Methoden, die für das Crawling einer Webseite benötigt werden. Dabei wird für jede besuchte Seite in einer Domain der HTML-Code ausgelesen und die enthaltenen Links werden auf ihre Gültigkeit überprüft. Die Klasse ist so aufgebaut, dass sie einfach in bestehende PHP-Projekte integriert werden kann.

Funktionsweise der Klasse

Die Klasse WebCrawler startet mit einem übergebenen Start-URL. Aus dieser wird der Basishost abgeleitet. Nur Seiten, die zum gleichen Host gehören werden gecrawlt (andernfalls läuft der Crawler über das ganze Internet :). Die Seite wird auf ihre Gültigkeit überprüft und anschließend besucht. Für jede besuchte Seite wird der HTML-Code ausgelesen und alle enthaltenen Links werden extrahiert, in absolute URLs umgewandelt und auf ihre Gültigkeit überprüft. Dabei wird geprüft, ob es sich bei dem Link um einen toten Link handelt, also nicht Statuscode = 200. Alle besuchten Links werden dabei in einer Liste gespeichert, um zu verhindern, dass bereits besuchte Seiten erneut aufgerufen werden. Das Crawlen der Seite und das Überprüfen der Links findet dabei rekursiv statt, bis entweder keine weiteren Links gefunden werden oder die maximale Crawl-Tiefe erreicht ist.

Aufruf der Klasse

Damit es läuft muss die cert Datei von der Curl Seite runtergeladen worden sein und der Pfad unter CURLOPT_CAINFO hinterlegt sein.

Dann kann man loslegen:

$webcrawler = new WebCrawler();
$webcrawler->crawl("https://example.com");

Anpassungsmöglichkeiten der Klasse

Die Klasse WebCrawler bietet verschiedene Möglichkeiten zur Anpassung.

So können beispielsweise die CURL-Optionen angepasst werden. Diese sind als Konstanten definiert. Hier ist eine Sache etwas kniffelig: Damit die HTTPS Verbindubgvsicher ist, benötigt man eine Zertifikatsdatei (cert.pem). Diese kann man von der CURL Seite herunterladen.

Über Setter können aber auch beispielsweise ein Proxy-Server oder oder einen anderen User-Agent gesetzt werden. Es ist auch möglich, eine eigene Klasse zu erstellen, die von WebCrawler erbt und somit das Verhalten der Klasse anpassen kann. Beispielsweise könnte eine eigene Klasse erstellt werden, die auf gefundene tote Links anders reagiert, als die standardmäßige Ausgabe in der Konsole.

Welche Einschränkungen gibt es bei der Klasse?

Die Klasse WebCrawler ist zwar einfach zu implementieren und bietet eine Möglichkeit, um schnell tote Links auf einer Webseite zu finden. Es gibt jedoch auch Einschränkungen. So kann die Klasse beispielsweise nicht mit dynamisch generierten Inhalten umgehen. Auch ist die Geschwindigkeit des Crawlers von der Geschwindigkeit der aufgerufenen Webseite abhängig. Eine zu schnelle Anfragen an eine Webseite können auch als unerwünschte Belastung der Serverinfrastruktur gewertet werden.

Was fehlt um die Klasse als professionellen Crawler einzusetzen?

Obwohl die Klasse WebCrawler ein nützliches Tool für das Prüfen von toten Links auf einer Website ist, gibt es noch einige Einschränkungen, die sie für den professionellen Einsatz als Crawler ungeeignet machen.

Skalierbarkeit

WebCrawler wurde für den Einsatz auf kleinen bis mittelgroßen Websites entwickelt. Auf großen Websites mit Hunderten oder Tausenden von Seiten kann die Performance jedoch schnell zum Problem werden. Da die Klasse auf einem einzigen Thread läuft, können lange Ladezeiten und hohe Serverlasten auftreten, die die Seite verlangsamen und die Integrität der Seite gefährden können.

Robustheit

WebCrawler ist nicht sehr robust gegenüber Änderungen auf Websites. Wenn eine Website Layout-Änderungen oder Änderungen an den Link-URLs vornimmt, kann dies dazu führen, dass WebCrawler nicht mehr funktioniert oder fehlerhafte Ergebnisse liefert.

Authentifizierung

WebCrawler unterstützt derzeit keine Authentifizierungsmethoden wie beispielsweise Login-Seiten. Wenn eine Website geschützte Bereiche hat, kann WebCrawler keine Links in diesen Bereichen prüfen.

Datenbankintegration

Die Klasse speichert derzeit keine Ergebnisse in einer Datenbank. Wenn Sie eine große Anzahl von Seiten crawlen und Ergebnisse speichern möchten, müssen Sie eine eigene Datenbank-Integration implementieren.

Freundlicher Crawler

Damit man als Crawler nicht unbeliebt auffällt oder Websites stört gibt es verschiedene Techniken mit User-Agent und Proxies. Darauf gehe ich hier nicht weiter ein.

Umgang mit Fehlern

Was passiert bei unsauberen HTML? Was passiert bei einem Timeout? Was passiert wenn der Speicher überläuft? Das muss alles noch gelöst werden.

Cookies

Manche Seiten wollen Cookies setzen. Dies muss auch ermöglicht werden.

Fazit

WebCrawler ist ein nützliches Werkzeug für das Prüfen von toten Links auf einer Website. Es kann schnell und einfach implementiert werden und ist daher ideal für kleinere Websites geeignet. Wenn Sie jedoch eine große Website mit vielen Seiten haben oder eine robuste und skalierbare Lösung suchen, sollten Sie möglicherweise eine professionellere Lösung in Erwägung ziehen.

Beispielsweise bietet die Python Bibliothek Scrapy viele erweiterte Möglichkeiten. Eine Implementierung eines Crawlers mittels Scrapy habe ich hier beschrieben.

Trotzdem ist WebCrawler ein guter Ausgangspunkt, um sich mit Web-Crawling-Techniken vertraut zu machen und die Grundlagen zu erlernen. Es bietet auch die Möglichkeit, die Klasse an Ihre spezifischen Anforderungen anzupassen und zu erweitern.



Als erster einen Kommentar schreiben.

Schreibe einen Kommentar

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