处理连接错误和JSoup(Handling connection errors and JSoup)

2019-06-23 19:16发布

我试图创建一个应用程序刮内容从网站上的多个页面。 我使用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次,在未能第三次我想要的网址添加到“失败”阵这样我就可以重新尝试在未来失败的连接。

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

Answer 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 。 当你捕获异常,循环应该继续。 如果你能得到的数据,然后返回或断裂。 呼喊,如果你需要用它更多的帮助!



Answer 2:

以上的回报一个IOException为我而不是执行()返回正确的状态码。

使用JSoup-1.6.1我不得不改变上面的代码使用ignoreHttpErrors(真) 。

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

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


文章来源: Handling connection errors and JSoup