Linkfetcher – Mit PHP Links extrahieren
20. Juli 2008 | In: Php
Um aus einer Webseite alle Links zu extrahieren gibt es schon so einige Lösungen im Netz. Die meisten basieren auf einigen simplen regulären Ausdrücken. Da ich für ein aktuelles Projekt eine Möglichkeit brauchte um zusätzlich zu den Links auch alle Attribute, wie “title”, “rel”, “target” … etc. zu erhalten, habe ich dazu eine Klasse geschrieben.
Linkfetcher benötigt zwingend PHP 5 mit diversen Erweiterungen wie domobject, xpath, mb string … und liefert alle gefunden Links als array of stdClass mit den folgenden Attributen:
Attribute
‘rel’, ‘accesskey’, ‘charset’, ‘coords’, ‘href’, ‘hreflang’, ‘name’, ‘rev’, ’shape’, ‘tabindex’
Events
‘onblur’, ‘onfocus’, ‘onclick’, ‘ondblclick’, ‘onmousedown’, ‘onmouseup’, ‘onmouseover’, ‘onmousemove’, ‘onmouseout’, ‘onkeypress’, ‘onkeydown’, ‘onkeyup’
Universalattribute:
‘id’, ‘class’, ’style’, ‘title’
Sprachattribute:
‘dir’, ‘lang’
Nicht gefundene Attribute werden als “” leerer String zurückgegeben. Die Class-Properties nennen sich genau wie die Attribute in der HTML-Spezifikation. Einzig der Linktext wird in “text” abgelegt und kann über $link->text abgerufen werden.
Die folgenden Methoden sind implementiert:
GetLinks( $url ); extrahiert aus der angegebenen Url sämtliche Links inklusive aller Attribute.
GetLink( $link, $exact ); überprüft, ob $link beim letzen Aufruf von GetLinks(…) gefunden wurde. Der optionale Parameter exact legt fest, ob der Link genau übereinstimmen muss oder ob es reicht, wenn ein Link gleich beginnt.
Beispiel #1:
Der Codeschnipsel holt sämtliche Links von www.google.de und gibt sie inklusive aller Attribute aus.
include_once( 'linkfetcher.class.php' ); $Linkfetcher = new Linkfetcher(); $Linkfetcher->GetLinks( 'http://www.google.de' ); var_dump( $Linkfetcher->links ); |
Beispiel #2:
In diesem Beispiel werden wieder alle Links von www.google.de extrahiert. Anschliessend wird überprüft, ob der Link “http://images.google.de” in der Ergebnismenge enthalten ist. Da $exact auf false gesetzt wurde, genügt es, wenn ein Link mit “http://images.google.de” beginnt.
Bei Erfolg wird der gefundene Link als stdClass Object zurückgeliefert. False sonst.
include_once( 'linkfetcher.class.php' ); $Linkfetcher = new Linkfetcher(); $Linkfetcher->GetLinks( 'http://www.google.de' ); var_dump( $Linkfetcher->GetLink( 'http://images.google.de', false ) ); |
Beispiel #3:
Hole alle Links von www.google.de mit nur den Attributen href, rel und title
include_once( 'linkfetcher.class.php' ); $Linkfetcher = new Linkfetcher( array( 'attributes' => array( 'href', 'rel', 'title' ) ) ); $Linkfetcher->GetLinks( 'http://www.google.de' ); var_dump( $Linkfetcher->links ); |
Update: Ein kleiner Fehler in einem regulären Ausdruck wurde beseitigt.
Download v1.1

8 Kommentare zu Linkfetcher – Mit PHP Links extrahieren
Mario
17. April 2009 um 12:11:28
Hallo, ich finde diese PHP-Klasse sehr nützlich nur da ich mich noch nicht mit PHP-Objekten beschäftigt habe, habe ich so meine Probleme mit dieser Klasse. Kannst du mal bitte an einem Beispiel zeigen, wie man die Links auflisten kann:
Beispiel:
- zu analysierende Seite hat 10 Links
- Links in einer Schleife ausgeben (Linktext, Linkziel)
Vielen Dank
naden
17. April 2009 um 15:03:39
@mario, im ZIP-Archiv ist eine demo.php da ist ein Beispiel drin, wie auch hier auf der Webseite.
Infos zu PHP findest du auf http://de.php.net oder beim Hersteller http://www.zend.com
Mario
19. April 2009 um 14:24:15
ja, das habe ich auch gesehen, aber wie kann ich z.B. auf den 5. gefunden Link zugreifen und das Linkziel ausgeben?
naden
19. April 2009 um 21:05:29
$links = $Linkfetcher->GetLinks() liefert ein Array. Auf das 5. Element eines Arrays mit numerischem Index greift man mit $links[ 4 ] zu.
Auch nützlich: http://de.php.net/manual/de/language.types.array.php
Xel
28. Mai 2009 um 01:39:26
Erstmal danke, dass du dir diese Mühe überhaupt gemacht hast.
Mir ist aber aufgefallen, dass das wirklich nur unter sehr speziellen Bedingungen richtig funktioniert.
Beispiele die nicht funktionieren:
gecrawled wird: example.org/test/test.html
a href=”foo.html” => example.org/test/test.htmlfoo.html
a href=”/foo.html” => example.org/test/test.html/foo.html
a href=”./foo.html” => example.org/test/test.html./foo.html
Eigentlich müsste aber
example.org/test/foo.html
example.org/foo.html
example.org/test/foo.html
rauskommen.
naden
28. Mai 2009 um 14:02:55
@xel, ich habe auch immer wieder unerklärliche Probleme mit diversen Webseiten.
Leider habe ich für viele Probleme keine Lösung gefunden, da die Klasse massiv DOMXPath, xPath etc. nutzt und diese innerhalb der Bibliotheken auftreten.
Ich habe eine sehr viel neuere Version der Klasse rumliegen, die muss ich in den kommenden Tagen mal uploaden.
Alex
14. Juli 2009 um 02:04:23
Hallo Naden,
erstmal vielen Dank für das Skript. Wirst du noch die neue Version uploaden?
Gruß
Alex
naden
16. Juli 2009 um 17:55:47
@alex kommt! Ich muss die Doku nich etwas überarbeiten.