2012-04-20 34 views
5

Ich versuche, eine Anwendung erstellen, um Inhalt von mehreren Seiten auf einer Website zu entfernen. Ich verwende JSoup, um eine Verbindung herzustellen. Das ist mein Code:Umgang mit Verbindungsfehlern und JSoup

for (String locale : langList){ 
     sitemapPath = sitemapDomain+"/"+locale+"/"+sitemapName; 
     try { 
      Document doc = Jsoup.connect(sitemapPath) 
        .userAgent("Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/535.21 (KHTML, like Gecko) Chrome/19.0.1042.0 Safari/535.21") 
        .timeout(10000) 
        .get(); 

      Elements element = doc.select("loc"); 
      for (Element urls : element) { 
       System.out.println(urls.text()); 
       } 
     } catch (IOException e) { 
      System.out.println(e); 
     } 
    } 

Alles funktioniert perfekt die meiste Zeit. Es gibt jedoch ein paar Dinge, die ich tun möchte.

Zuerst wird manchmal ein 404-Status zurückgegeben oder ein 500-Status vielleicht ein 301. Mit meinem Code unten wird es nur den Fehler ausdrucken und auf die nächste URL bewegen. Ich möchte in der Lage sein, den URL-Status für alle Links zurückzugeben. Wenn die Seite eine Verbindung herstellt, drucken Sie 200, wenn nicht, drucken Sie den entsprechenden Statuscode aus.

Zweitens erfahre ich manchmal diesen Fehler "java.net.SocketTimeoutException: Zeitüberschreitung gelesen" Ich könnte mein Timeout erhöhen, aber ich würde lieber versuchen, 3 mal zu verbinden, nach dem dritten Mal möchte ich die URL zu einem hinzufügen "fehlgeschlagen" Array, so dass ich die fehlgeschlagenen Verbindungen in der Zukunft erneut versuchen kann.

Kann mir jemand mit mehr Wissen als ich helfen?

Antwort

15

Für Ihre erste Frage, können Sie Ihre Verbindung tun/lesen in zwei Schritten, Anhalten für den Statuscode in der Mitte zu fragen, wie so:

Connection.Response response = Jsoup.connect(sitemapPath) 
         .userAgent("Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/535.21 (KHTML, like Gecko) Chrome/19.0.1042.0 Safari/535.21") 
         .timeout(10000) 
         .execute(); 

int statusCode = response.statusCode(); 
if(statusCode == 200) { 
    Document doc = connection.get(); 
    Elements element = doc.select("loc"); 
    for (Element urls : element) { 
     System.out.println(urls.text()); 
    } 
} 
else { 
    System.out.println("received error code : " + statusCode); 
} 

Beachten Sie, dass die execute() Methode mit einem IOException fehl Wenn es nicht möglich ist, eine Verbindung zum Server herzustellen, wenn die HTTP-Antwort usw. falsch ist, müssen Sie damit umgehen. Solange der Server jedoch etwas Sinnvolles sagt, können Sie den Statuscode lesen und fortfahren. Auch wenn Sie Jsoup gebeten haben, den Weiterleitungen zu folgen, werden Sie keine 30x Antwortcodes sehen. B/c Jsoup wird den Statuscode von der letzten abgerufenen Seite setzen.

Wie für Ihre zweite Frage, alles, was Sie brauchen, ist eine Schleife um das Codebeispiel, das ich Ihnen gerade gab, das mit einem try/catch-Block mit SocketTimeoutException verpackt ist. Wenn Sie die Ausnahme abfangen, sollte die Schleife fortgesetzt werden. Wenn Sie Daten abrufen können, kehren Sie zurück oder brechen Sie ab. Rufe, wenn du mehr Hilfe brauchst!

+0

erzeugt eine Ausnahme –

15

Das obige gibt eine IOException für mich statt der execute() den richtigen Statuscode zurückgeben.

Mit JSoup-1.6.1 musste ich den obigen Code ändern, um ignoreHttpErrors(true) zu verwenden.

Jetzt, wenn der Code die Antwort zurückgibt, anstatt eine Ausnahme zu werfen, und Sie können die Fehlercodes/Nachrichten überprüfen.

Connection.Response response = null; 
      try { 
       response = Jsoup.connect(bad_url) 
         .userAgent("Mozilla/5.0 (Windows NT 6.0) AppleWebKit/536.5 (KHTML, like Gecko) Chrome/19.0.1084.46 Safari/536.5") 
         .timeout(100000) 
         .ignoreHttpErrors(true) 
         .execute(); 
      } catch (IOException e) { 
       System.out.println("io - "+e); 
      } 

      System.out.println("Status code = " + response.statusCode()); 
      System.out.println("Status msg = " + response.statusMessage()); 

Output:

Status code = 404 
Status msg = Not Found