我正在尝试创建一个应用程序,以从站点的多个页面上抓取内容。我正在使用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添加到“失败的”数组中因此我以后可以重试失败的连接。
能比我更多知识的人可以帮助我吗?
对于第一个问题,您可以分两个步骤进行连接/阅读,停止在中间询问状态代码,如下所示:
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将从获取的最后一页设置状态代码。
execute()
IOException
30x
至于第二个问题,您需要做的是围绕我刚刚给您的代码示例循环,并用try / catch块包装SocketTimeoutException。当您捕获异常时,循环应继续。如果能够获取数据,则返回或中断。喊如果您需要更多帮助!
SocketTimeoutException