UnknownHostException obwohl Server&Datei vorhanden

Servus,

zurzeit will ich einen einfachen Webspider schreiben. Die Links werden zwar gut erkannt, aber viele (nicht alle!) können nicht geladen werden, obwohl Sie existieren (URL kopiert und in Browser geladen). Die Frage ist natürlich warum. Als Test-Addresse habe ich „yahoo.de“ genommen.

Codeausschnitt (SpiderThread.java):

import java.net.URL;
import java.util.Scanner;
import org.htmlparser.Node;
import org.htmlparser.Parser;
import org.htmlparser.nodes.TagNode;
import org.htmlparser.util.NodeList;

public class SpiderThread implements Runnable {
 URL getUrl;
 public void run(){
 while(!Main.stop){
 try {
 if(!Main.toDo.isEmpty()){ //Main.toDo ist ArrayList mit zu ladenden URLs
 String currenturl = Main.toDo.remove(0);
 Main.visited.add(currenturl); //Main.visited ist ArrayList mit besuchten URLs
 try {
 getUrl = new URL("http://" + currenturl);
 Scanner sc = new Scanner(getUrl.openStream());
 String request = "";
 while(sc.hasNext()){
 request += sc.next();
 }
 try {
 Parser p = Parser.createParser(request,null);
 NodeList nl = p.parse(null);
 System.out.println("Parsing "+currenturl);
 recursiveLinkSearch(nl);
 } catch(Exception e){}
 } catch (Exception ex) {
 System.out.println("Error loading File: "+currenturl+" ("+ex.getClass().getSimpleName()+")");
 }

 } else
 Thread.sleep(200);
 } catch (InterruptedException ex) {}
 }
 }
 public void recursiveLinkSearch(NodeList element){
 for(int i=0; i

Vielen Dank für Hilfe.

grtz
michi

Hallo,

ich würde dir mal vorschlagen statt

} catch(Exception e){}

einfach mal

} catch(UnknownHostExceptio e){}

zu schreiben.

Und achte auch immer darauf das du nicht einfach nur schreibst Exception e sondern immer für jede Exception die auftreten kann einen eigenen catch zu machen.

Wenn du weist wo die Exception gewurfen wird, poste sie einfach wenn du noch Hilfe brauchst.

mfg DK1988

Mir ist klar worauf du hinaus willst: Man soll jede Exception anders abfangen. Das soll aber in dem Programm nicht passieren, eine Datei die nicht geladen werden kann, soll entweder nur mit Art des Fehlers oder überhaupt nicht ausgegeben werden. Deswegen auch nur ein „catch(Exception e){…}“.

Die Exception tritt eben bei

Scanner sc = new Scanner(getUrl.openStream());

auf => beschriebener Fehler.

grtz
michi

Hallo,

Die Exception tritt eben bei

Scanner sc = new
Scanner(getUrl.openStream());

auf => beschriebener Fehler.

Fehlermeldungen und Stacktrace während der Entwicklung zu beschneiden ist nicht ratsam. Erweitert man den catch Block um folgendes

catch (Exception ex) 
{
 System.out.println("Error loading File: "+currenturl+" ("+ex.getClass().getSimpleName()+")");
 System.err.println(ex.getMessage());
 ex.printStackTrace();
}

Erscheint die zielführende Meldung

Error loading File: http://www.wer-weiss-was.de//css/www.css?v=29e4e8e91f6bfb0ceda73003 (UnknownHostException)
http
java.net.UnknownHostException: http
 at java.net.PlainSocketImpl.connect(Unknown Source)
 at java.net.SocksSocketImpl.connect(Unknown Source)
 at java.net.Socket.connect(Unknown Source)
 at java.net.Socket.connect(Unknown Source)
 at sun.net.NetworkClient.doConnect(Unknown Source)
 at sun.net.www.http.HttpClient.openServer(Unknown Source)
 at sun.net.www.http.HttpClient.openServer(Unknown Source)
 at sun.net.www.http.HttpClient.(Unknown Source)
...

Weshalb? Wie die erste Zeile zeigt enthält currenturl den kompletten Link, inclusive Protokoll, weiter oben setzt du die URL aber so zusammen:

getUrl = new URL("http://" + currenturl);

damit kommt dann insgesamt http://http://… heraus und http wird als Server interpretiert. Java Exceptions lügen i.d.R. nicht :smile:

HTH
Heavy