Java 处理连接错误和JSoup

Java 处理连接错误和JSoup,java,connection,jsoup,Java,Connection,Jsoup,我正在尝试创建一个应用程序,从一个站点的多个页面中刮取内容。我正在使用JSoup进行连接。这是我的代码: for (String locale : langList){ sitemapPath = sitemapDomain+"/"+locale+"/"+sitemapName; try { Document doc = Jsoup.connect(sitemapPath) .userAgent("M

我正在尝试创建一个应用程序,从一个站点的多个页面中刮取内容。我正在使用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添加到“failed”数组中,以便将来可以重试失败的连接


你的第一个问题,你可以在两个步骤中完成你的连接/读,停止在中间问状态码,比如:

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()
方法无法连接到服务器,或者响应是格式错误的HTTP等,则该方法将失败,并出现
IOException
,因此您需要处理该问题。但是,只要服务器说了一些有意义的话,您就可以读取状态代码并继续。此外,如果您要求Jsoup遵循重定向,您将不会看到
30x
响应代码b/c Jsoup将从最后获取的页面设置状态代码


至于你的第二个问题,你所需要的只是围绕我刚才给你的代码示例进行一个循环,这个示例用一个try/catch块包装,带有
SocketTimeoutException
。当捕捉到异常时,循环应该继续。如果您能够获取数据,则返回或中断。如果你需要更多的帮助,大声喊

上面为我返回一个IOException,而不是返回正确状态代码的execute()

使用时,我必须更改上述代码以使用

现在,当代码返回响应而不是抛出异常时,您可以检查错误代码/消息

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

生成异常