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
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.
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){…}“.
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