Java 处理连接错误和JSoup
我正在尝试创建一个应用程序,从一个站点的多个页面中刮取内容。我正在使用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
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
生成异常