2012-04-20 108 views
5

我正試圖創建一個應用程序來刮掉網站上的多個頁面的內容。我正在使用JSoup來連接。這是我的代碼:處理連接錯誤和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); 
     } 
    } 

大部分時間都能正常工作。然而,我想要做的事情有幾件事。

首先有時會返回404狀態,或者500狀態可能是301.下面我的代碼只會打印錯誤並轉到下一個網址。我希望能夠做的是嘗試能夠返回所有鏈接的網址狀態。如果頁面連接打印200,則不打印相關的狀態碼。

其次我有時會發現這個錯誤「java.net.SocketTimeoutException:讀取超時」我可以增加超時但是我寧願嘗試連接3次,失敗後第三次我想將URL添加到「失敗」陣列,以便將來可以重試失敗的連接。

比我有更多知識的人能幫助我嗎?

回答

15

關於第一個問題,你可以做你的連接/分兩步閱讀,停下來問的狀態代碼在中間,像這樣:

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

注意,​​方法將失敗並IOException如果它無法連接到服務器,如果響應格式錯誤的HTTP等,所以你需要處理。但是,只要服務器說出了有意義的東西,就可以讀取狀態碼並繼續。另外,如果您已經要求Jsoup遵循重定向,您將不會看到30x響應代碼b/c Jsoup將從所獲取的最終頁面設置狀態代碼。

至於你的第二個問題,你所需要的只是一個圍繞着我剛剛給你的代碼示例的循環,它是用一個帶有SocketTimeoutException的try/catch塊封裝的。當你發現異常時,循環應該繼續。如果你能夠獲得數據,然後返回或中斷。如果您需要更多幫助,請留言!

+0

產生異常 – 2013-10-19 05:33:51

15

上面爲我返回一個IOException,而不是execute()返回正確的狀態碼。

使用JSoup-1.6.1我必須更改上述代碼才能使用ignoreHttpErrors(true)

現在,當代碼返回響應而不是拋出異常,並且您可以檢查錯誤代碼/消息。

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

輸出:

Status code = 404 
Status msg = Not Found