RSS Feed

Linkfetcher – Mit PHP Links extrahieren

20.07.2008 by naden

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 »

  1. Mario sagt:

    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

  2. naden sagt:

    @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

  3. Mario sagt:

    ja, das habe ich auch gesehen, aber wie kann ich z.B. auf den 5. gefunden Link zugreifen und das Linkziel ausgeben?

  4. naden sagt:

    $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

  5. Xel sagt:

    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.

  6. naden sagt:

    @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.

  7. Alex sagt:

    Hallo Naden,

    erstmal vielen Dank für das Skript. Wirst du noch die neue Version uploaden?

    Gruß
    Alex

  8. naden sagt:

    @alex kommt! Ich muss die Doku nich etwas überarbeiten.

Hinterlasse eine Antwort

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

*

Du kannst folgende HTML-Tags benutzen: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>