2012-04-20 19 views
5

Sto provando a creare un'applicazione per raschiare il contenuto da più pagine su un sito. Sto usando JSoup per connetterti. Questo è il mio codice:Gestione degli errori di connessione e 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); 
     } 
    } 

Tutto funziona perfettamente la maggior parte del tempo. Tuttavia ci sono alcune cose che voglio essere in grado di fare.

Per prima cosa a volte viene restituito uno stato 404 o uno stato 500 forse un 301. Con il mio codice qui sotto verrà stampato l'errore e spostato sull'URL successivo. Quello che vorrei essere in grado di fare è cercare di essere in grado di restituire lo stato dell'URL per tutti i link. Se la pagina si connette stampare un 200, se non stampare il codice di stato rilevante.

In secondo luogo a volte viene rilevato questo errore "java.net.SocketTimeoutException: lettura scaduta" Potrei aumentare il mio timeout, tuttavia preferirei provare a connettersi 3 volte, in caso di mancata terza volta voglio aggiungere l'URL a un array "fallito" in modo da poter riprovare le connessioni fallite in futuro.

Qualcuno con più conoscenza di me può darmi una mano?

risposta

15

Per la vostra prima domanda, si può fare la vostra connessione/letto in due fasi, fermandosi a chiedere il codice di stato al centro in questo modo:

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); 
} 

Nota che il metodo execute() non riuscirà con un IOException se non è in grado di connettersi al server, se la risposta è malformata HTTP, ecc., quindi è necessario gestirla. Tuttavia, fino a quando il server ha detto qualcosa che ha senso, sarete in grado di leggere il codice di stato e continuare. Inoltre, se hai chiesto a Jsoup di seguire i reindirizzamenti, non vedrai i codici di risposta 30x b/c Jsoup imposterà il codice di stato dalla pagina finale recuperata.

Per quanto riguarda la seconda domanda, tutto ciò di cui hai bisogno è un ciclo intorno al codice di esempio che ti ho appena dato, che è avvolto con un blocco try/catch con SocketTimeoutException. Quando rilevi l'eccezione, il ciclo dovrebbe continuare. Se sei in grado di ottenere dati, quindi tornare o interrompere. Grida se hai bisogno di più aiuto con esso!

+0

genera un'eccezione –

15

Quanto sopra restituisce IOException per me piuttosto che execute() che restituisce il codice di stato corretto.

Utilizzo JSoup-1.6.1 Ho dovuto modificare il codice precedente per utilizzare ignoreHttpErrors(true).

Ora, quando il codice restituisce la risposta anziché lanciare un'eccezione, è possibile controllare i codici/messaggi di errore.

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()); 

uscita:

Status code = 404 
Status msg = Not Found 
Problemi correlati