2012-04-20 44 views
5

Tôi đang cố tạo ứng dụng để xóa nội dung của nhiều trang trên một trang web. Tôi đang sử dụng JSoup để kết nối. Đây là mã của tôi:Xử lý lỗi kết nối và 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); 
     } 
    } 

Mọi thứ hoạt động hoàn toàn phần lớn thời gian. Tuy nhiên có một vài điều tôi muốn có thể làm.

Tắt lần đầu tiên trạng thái 404 sẽ trở lại hoặc trạng thái 500 có thể là 301. Với mã bên dưới, mã sẽ chỉ in lỗi và chuyển sang url tiếp theo. Những gì tôi muốn có thể làm là cố gắng để có thể trả lại trạng thái url cho tất cả các liên kết. Nếu trang kết nối in 200, nếu không in mã trạng thái có liên quan. Thứ hai, đôi khi tôi bắt gặp lỗi này "java.net.SocketTimeoutException: Read timeed out" Tôi có thể tăng thời gian chờ của mình tuy nhiên tôi muốn kết nối 3 lần, sau khi thất bại lần thứ 3 tôi muốn thêm URL vào mảng "không thành công" để tôi có thể thử lại các kết nối không thành công trong tương lai.

Ai đó có nhiều kiến ​​thức hơn tôi có thể giúp tôi không?

Trả lời

15

Đối với câu hỏi đầu tiên của bạn, bạn có thể làm kết nối của bạn/đọc theo hai bước, dừng lại để hỏi cho mã trạng thái ở giữa như vậy:

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

Lưu ý rằng phương pháp execute() sẽ thất bại với một IOException nếu không thể kết nối với máy chủ, nếu phản hồi là HTTP không đúng định dạng, v.v., vì vậy bạn sẽ cần phải xử lý điều đó. Tuy nhiên, miễn là máy chủ nói điều gì đó có ý nghĩa, bạn sẽ có thể đọc mã trạng thái và tiếp tục. Ngoài ra, nếu bạn đã yêu cầu Jsoup theo dõi chuyển hướng, bạn sẽ không thấy 30x mã phản hồi b/c Jsoup sẽ đặt mã trạng thái từ trang cuối cùng được tìm nạp.

Đối với câu hỏi thứ hai, tất cả những gì bạn cần là vòng lặp quanh mẫu mã mà tôi vừa đưa cho bạn, được gói với khối try/catch với SocketTimeoutException. Khi bạn bắt ngoại lệ, vòng lặp sẽ tiếp tục. Nếu bạn có thể nhận dữ liệu, sau đó quay lại hoặc ngắt. Shout nếu bạn cần thêm trợ giúp với nó!

+0

tạo ra một ngoại lệ –

15

Ở trên trả về một IOException cho tôi thay vì thực thi() trả lại mã trạng thái chính xác.

Sử dụng JSoup-1.6.1 Tôi phải thay đổi mã ở trên để sử dụng ignoreHttpErrors(true).

Bây giờ khi mã trả về phản hồi thay vì ném ngoại lệ và bạn có thể kiểm tra mã/thông báo lỗi.

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 
Các vấn đề liên quan