我试图创建一个应用程序刮内容从网站上的多个页面。 我使用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次,在未能第三次我想要的网址添加到“失败”阵这样我就可以重新尝试在未来失败的连接。
有人比我更多的知识能帮助我吗?
关于第一个问题,你可以做你的连接/分两步阅读,停下来问的,像这样的中间状态代码:
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
。 当你捕获异常,循环应该继续。 如果你能得到的数据,然后返回或断裂。 呼喊,如果你需要用它更多的帮助!
以上的回报一个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