Fabi: Linkgültigkeit prüfen

Hallo,
ich bin dabei ein Programm zu schreiben, das mitunter die Links einer ausgewählten Webseite überprüft. Ich weiß es gibt genug tools im Netz, die das hervorragend machen, aber ich wollte bzw. sollte diese Funktionalität auch in meinem Prgogramm haben.
Nun habe ich jetzt das Problem, dass ich nicht so recht weiß wie ich es anstellen soll. Zum Beispiel weiß ich noch nicht wie ich alle Links (Standard-Links, Bilder als Links, E-mail-Verknüpfungen, Anker) einer Webseite finden kann? Oder wie kann ich die Links auf ihre Gültigkeit überprüfen? Ist das ein broken-Link oder ist der Link gültig? Ich programmiere in Java. Die Daten (Quellcode) einer Html-Seite auszulesen, ist kein Problem aber die Links abzufragen(http://.../bla.com, ftp://ftp.bla.de, gopher://ftp.std.com/1, telnet://locis.loc.gov, usw.) ist nicht so einfach...
Ich würd mich über jeden Vorschlag freuen!
Gruss

  1. Hallo Fabi,

    Nun habe ich jetzt das Problem, dass ich nicht so recht weiß wie ich es anstellen soll.

    Du bist zu bescheiden. Du hast doch bereits einen ersten Ansatz, den ich aus Deinem Posting mal extrahiere. Bitte entschuldige, dass ich die Reihenfolge etwas abändere:

    Die Daten (Quellcode) einer Html-Seite auszulesen, ist kein Problem

    erster Schritt getan.

    Zum Beispiel weiß ich noch nicht wie ich alle Links (Standard-Links, Bilder als Links, E-mail-Verknüpfungen, Anker) einer Webseite finden kann?

    zweiter Schritt, noch zu tun, aber bereits ein Ansatz.

    Oder wie kann ich die Links auf ihre Gültigkeit überprüfen? Ist das ein broken-Link oder ist der Link gültig?

    dritter Schritt, noch zu tun, aber bereits ein Ansatz:

    aber die Links abzufragen(http://.../bla.com, ftp://ftp.bla.de, gopher://ftp.std.com/1, telnet://locis.loc.gov, usw.) ist nicht so einfach...

    Ich programmiere in Java.

    Deswegen von mir nur ein paar Anregungen zu Schritt 2:

    Wo können überall Ressourcen referenziert werden? Was fällt Dir dazu ein?

    Inwieweit willst Du Ressourcen, die in einer externen Ressource referenziert werden, überprüfen? Welche Schachtelungstiefe willst Du berücksichtigen?

    Beispiel gefällig: Ein externes Stylesheet, das im <head>-Element eingebunden ist, enthält Referenzen auf Hintergrundbilder.

    Reicht es Dir, wenn die CSS-Datei vorhanden ist, oder müssen auch die dort angegebenen Bilder vorhanden sein?

    Auch wenn der Tipp _nichts_ mit Java zu tun hat, sondern mit PHP; schau Dir dennoch an, auf was in einem anderen Thread Tobias verweist. Versuche zu verstehen, was dort das Ziel ist, inwieweit dieses Ziel mit Deinem Ziel verwandt ist, ob Du den Weg verwenden kannst. Falls ja, setze dies mit Java um.

    Ich selbst habe nur sehr wenig Kenntnisse von Java, und kann Dir deswegen insbesondere nicht weiterhelfen, was Schritt 3 betrifft.

    Freundliche Grüße

    Vinzenz

    1. Hallo Vizenz,
      da sind gute Fragen, die du berechtigterweise stellst.
      Ich würde sagen, wenn ich alle Links auf der vom Anwender angegebenen WebSeite finde und auf Gültigkeit überprüfe, dann reicht es vollkommen aus. Da ich die Seitenstruktur der Webseite als Baum darstelle, und der Anwender somit die Möglichkeit hat auch Teilseiten (nur die Folgeseiten der ausgewählten Webseite z.B. wenn www.google.de nur zwei Links enthält werden diese dann im Baum als Kinder des Wurzelknoten www.google.de dargestellt) auf Linkgültigkeit zu überprüfen. Also reicht es aus nur die enthaltenen Links der von ihm ausgewählten Seiten zu überprüfen.

      Danke auch für den Hinweis auf den anderen Thread. Es ist zwar Php-Code aber ich glaube das kann mir trotzdem weiterhelfen alle Links in einer Page zu finden. Ich glaube ich kann das einwenig ableiten.
      Dann müßte ich 'nur' noch diese gefundenen Links auf Gültigkeit überprüfen.
      Dann werde ich das mal versuchen. Ich danke dir vielmals für die Anregungen!
      Viele Grüße
      Fabi

  2. Hi,

    also: eigentlich wollte ich ja nur wissen ...

    ich bin dabei ein Programm zu schreiben, das mitunter die Links einer ausgewählten Webseite überprüft.

    ... warum Du die Links _mitunter_ prüfst.

    Aber um darauf eine Antwort zu bekommen, muß ich wohl erstmal ran, was? ;-)

    Ich weiß es gibt genug tools im Netz, die das hervorragend machen, aber ich wollte bzw. sollte diese Funktionalität auch in meinem Prgogramm haben.

    Nun, falls ich Dich nicht gerade mißverstanden habe, ist das auch schneller selbst geschrieben, als ein Drittanbieter angepaßt.

    Nun habe ich jetzt das Problem, dass ich nicht so recht weiß wie ich es anstellen soll. Zum Beispiel weiß ich noch nicht wie ich alle Links (Standard-Links, Bilder als Links, E-mail-Verknüpfungen, Anker) einer Webseite finden kann?

    Du möchtest also nur das Element 'a' benutzen? Der Link darin ist im Attribut 'href'. (ob der in Anführungsstrichen steht und in welchen und ob da Leerzeichen vorkommen ist zu überprüfen).
    Pech hast Du natürlich, wenn da Javascript drin steht.

    Oder wie kann ich die Links auf ihre Gültigkeit überprüfen?

    ("oder"?)
    Die einfachste Methode Links auf Gültigkeit zu überprüfen ist natürlich sie zu benutzen.

    Ich programmiere in Java.

    Das soll Dir nicht zum Nachteil angerechnet werden.
    Aber nur ausnahmsweise! >;->

    Die Daten (Quellcode) einer Html-Seite auszulesen, ist kein Problem aber die Links abzufragen(http://.../bla.com, ftp://ftp.bla.de, gopher://ftp.std.com/1, telnet://locis.loc.gov, usw.) ist nicht so einfach...

    Das verstehe ich nicht so ganz. Du hast Deinen Parser schon so weit, das er die Links findet und Du benötigst "nur" noch das Stück der jeweiligen Protokolle, das den Handshake bis zur evt Fehlermeldung durchführt?
    HTTP ist natürlich einfach:
    "GET /index.html HTTP/1.0" (im Fehlerfall dann natürlich noch einmal mit HTTP/1.1, aber sollte mich wundern)
    FTP ist etwas komplexer (aber eigentlich auch nur _mehr_ zu tun, nicht _schwieriger_ zu implementieren), siehe RFC 959
    GOPHER (ja, das wird wirklich noch benutzt! Man kann's kaum glauben ;-): RFC 1436
    TELNET ist in RFC 854/855. Aber das ist ganz simpel, selbst wenn Du Dich zwecks Überprüfung einloggen willst.

    Allerdings in Summe doch recht viel. Eine kurze Suche bei Google, ob es sowas zumindest halbfertig gibt würde ich doch investieren. Java ist relativ alt und ich wäre erstaunt, wenn es für die gängigen Protokolle keine entspr, Libs gibt, die den Handshake für Dich erledigen, sodaß Du nur noch die Antwort auf Fehler parsen mußt (auch Timeout ist hier ein Fehler), wenn die Lib nicht schon so nett ist.

    Die Sache hat auch noch einen prinzipiellen Haken. Der ist Dir wahrscheinlich zwar egal, aber trotzdem:
    Du prüfst hier darauf, das es "keinen Fehler" gibt, das ist normalerweise tödlich. Gut zu erkennen an der Negation "keine" in der Aufgabenstellung. Nun sind aber die Fehler in den Protokollen bereits sauber definiert inklusive der Zeitspanne, in der sie auftreten können. Die Fehlermeldungen, nicht die Fehler! Die Aufgabe "keine Fehler" ist also tatsächlich lösbar. Jedoch mit dem Haken, das Du nicht weißt, welche Daten sich hinter "keine Fehler" verbergen.
    Das kann die verlangte Seite mit dem Strickmuster sein, oder auch ein Redirect/Austausch der Seite auf/gegen Goatse/Tub-girl.

    so short

    Christoph Zurnieden

    1. Hallo Christoph,

      Aber um darauf eine Antwort zu bekommen, muß ich wohl erstmal ran, was? ;-)

      Die Antwort ist ganz einfach die, ich schreibe gerade für meine Studienarbeit eine Software die eine automatisierte Prüfung und Bewertung von Webseiten vornimmt. Dazu brauche ich unter anderem das "Plugin" Prüfung der Linkgültigkeit.

      Du möchtest also nur das Element 'a' benutzen? Der Link darin ist im Attribut 'href'. (ob der in Anführungsstrichen steht und in welchen und ob da Leerzeichen vorkommen ist zu überprüfen).
      Pech hast Du natürlich, wenn da Javascript drin steht.

      Ja genau ich wollte mich auf die Suche machen nach a href-Elementen und sie dann auf Richtigkeit überprüfen. Nur möchte ich sie nicht nur  auf die Syntax überpüfen, sondern wie du es schon richtig geschrieben hast auch ob sie funktionieren.

      Die einfachste Methode Links auf Gültigkeit zu überprüfen ist natürlich sie zu benutzen.

      Da muss eine Methode geben oder?

      Das verstehe ich nicht so ganz. Du hast Deinen Parser schon so weit, das er die Links findet und Du benötigst "nur" noch das Stück der jeweiligen Protokolle, das den Handshake bis zur evt Fehlermeldung durchführt?

      Parser ist viel. übertrieben, und die Links muss er noch finden ;-)
      ich werde dann mal nach den Sachen googlen. Ich muss gestehen, dass mir RFC 959 bis jetzt noch nicht viel sagt, ausser dass ein Protokoll ist, aber da werde ich mich mal schlau machen.
      Vielen Dank nochmal für die Hinweise!
      Gruss
      Fabi

      1. Hi,

        Aber um darauf eine Antwort zu bekommen, muß ich wohl erstmal ran, was? ;-)
        Die Antwort ist ganz einfach die, ich schreibe gerade für meine Studienarbeit eine Software die eine automatisierte Prüfung und Bewertung von Webseiten vornimmt. Dazu brauche ich unter anderem das "Plugin" Prüfung der Linkgültigkeit.

        Hatte ich beim letztem Mal vergessen: das RFC für die generische URI-Syntax ist 2396. Aber die entsprechenden Regexe sind normalerweise für fast alle Protokolle schon mal zusammengefummelt worden und im Netz zu finden.

        Das verstehe ich nicht so ganz. Du hast Deinen Parser schon so weit, das er die Links findet und Du benötigst "nur" noch das Stück der jeweiligen Protokolle, das den Handshake bis zur evt Fehlermeldung durchführt?

        Parser ist viel. übertrieben, und die Links muss er noch finden ;-)

        Nunja, die URI-Syntax ist simpel und auch einfach von Javascript Geraffel zu unterscheiden.

        ich werde dann mal nach den Sachen googlen. Ich muss gestehen, dass mir RFC 959 bis jetzt noch nicht viel sagt, ausser dass ein Protokoll ist, aber da werde ich mich mal schlau machen.

        Das ist das RFC vom FTP.
        Steht aber doch auch oben drüber?

        Etwas irritiert mich schon, das es eine Studienarbeit sein soll. Immerhin setzt sie allerhand an Wissen voraus, das Du nicht zu haben scheinst. Wenn ich mich da mal so vorsichtig ausdrücken darf. Das ist an sich nicht weiter schlimm, denn das kann man schließlich alles lernen -- das meiste sogar einfach nachschlagen, wenn man weiß wo.
        Aber einfach so in's eiskalte Wasser?
        Wie lang hast Du denn dafür Zeit?

        so short

        Christoph Zurnieden

        1. Hallo Christoph,

          Aber einfach so in's eiskalte Wasser?
          Wie lang hast Du denn dafür Zeit?

          Ja da hast du nicht ganz Unrecht. Es ist nicht ganz so einfach, aber es ist auf jeden Fall machbar. Die Sachen die ich nicht weiß, muss ich mir halt aneignen. Zeit habe ich noch bis Mitte Oktober, und das meiste (GUI, DBanbindung, einfachere Plugins usw.) ist schon fertig. Also ich komme schon zurecht, keine Sorge ;-)
          Viele Grüße
          Fabi

          1. Hi,

            Ja da hast du nicht ganz Unrecht. Es ist nicht ganz so einfach, aber es ist auf jeden Fall machbar. Die Sachen die ich nicht weiß, muss ich mir halt aneignen.

            Ein gesundes Selbstbewußtsein hast Du ja, das muß man Dir lassen ;-)

            Zeit habe ich noch bis Mitte Oktober, und das meiste (GUI, DBanbindung, einfachere Plugins usw.) ist schon fertig.

            Eigentlich wollte ich mich ja zurückhalten, aber ich bin einfach zu neugierig und kann einfach nicht an mich halten zu fragen: was zum Teufel wird das eigentlich wenn es fertig ist? Kann man das dann irgendwo bestaunen?

            Also ich komme schon zurecht, keine Sorge ;-)

            Sorgen machen würde ich mir eh nur, wenn Du auf meiner Lohnliste stündest ;-)

            so short

            Christoph Zurnieden