处理连接错误和JSoup

时间:2012-04-20 11:38:27

标签: java connection 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.使用下面的代码,它将只打印错误并移动到下一个URL。我希望能够做的是尝试返回所有链接的url状态。如果页面连接打印200,如果不打印相关的状态代码。

其次我有时会发现这个错误“java.net.SocketTimeoutException:read timed out”我可以增加我的超时但是我宁愿尝试连接3次,第3次失败时我想将URL添加到“失败的“数组,所以我可以在将来重试失败的连接。

比我更有知识的人可以帮助我吗?

2 个答案:

答案 0 :(得分:16)

上面为我返回一个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

答案 1 :(得分: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);
}

请注意,如果execute()方法无法连接到服务器,如果响应格式错误等等,IOException方法将失败并显示30x,因此您需要处理该问题。但是,只要服务器说出有意义的内容,您就能够读取状态代码并继续。此外,如果您已经要求Jsoup遵循重定向,您将不会看到SocketTimeoutException响应代码b / c Jsoup将从提取的最终页面设置状态代码。

至于你的第二个问题,你需要的只是我刚刚给你的代码示例循环,它包含一个带{{1}}的try / catch块。当您捕获异常时,循环应该继续。如果您能够获取数据,那么返回或中断。如果您需要更多帮助,请大声喊叫!