2012-04-20 83 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