小编典典

处理连接错误和JSoup

java

我正在尝试创建一个应用程序,以从站点的多个页面上抓取内容。我正在使用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:读取超时”,我可以增加超时时间,但是我希望尝试连接3次,但是第三次​​失败后,我想将URL添加到“失败的”数组中因此我以后可以重试失败的连接。

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


阅读 210

收藏
2020-10-15

共1个答案

小编典典

对于第一个问题,您可以分两个步骤进行连接/阅读,停止在中间询问状态代码,如下所示:

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

至于第二个问题,您需要做的是围绕我刚刚给您的代码示例循环,并用try /
catch块包装SocketTimeoutException。当您捕获异常时,循环应继续。如果能够获取数据,则返回或中断。喊如果您需要更多帮助!

2020-10-15