在不生成404头的网页上捕获404类型异常

时间:2013-03-29 04:00:53

标签: java html http-status-code-404 httpurlconnection

我试图找出一个网页是否存在使用Java,如果它以代码200(页面存在)响应。

我还可以通过获取响应代码404来查明页面是否存在(不存在)。 我的问题是有些网站没有给出404并且会重定向或显示不应该的页面吗?存在如下面的样本中所提供的。

我不知道这是不是因为我对html响应代码或java知之甚少。

任何帮助都将有助于在这些页面上获取错误代码而不是200,或者捕获异常。 (对不起,如果我没有意义)。

public class TestMain {

public static void main(String[] args) {

    Test test = new Test();
    test.UrlCheck();        
}
}

测试类

import java.io.IOException;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.ProtocolException;
import java.net.URL;

public class Test{

public void UrlCheck(){ 

    try{    
    URL url = new URL("http://googlewebmastercentral.blogspot.com.au/5000");
    HttpURLConnection urncon = (HttpURLConnection)url.openConnection (); 
    urncon.setRequestMethod ("HEAD"); 
    urncon.connect(); 

    int code = urncon.getResponseCode();    
    if(code == 200)
    System.out.println("Page Found");

    }catch(MalformedURLException mue){
        mue.printStackTrace();
    } catch (ProtocolException e) {
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    }
}       
}

6 个答案:

答案 0 :(得分:0)

我认为你无法在某些网站上使用它们 - 它们将拥有自定义404处理程序,页面将重定向到那里“未找到”(良好做法)。在这种情况下,404 eill永远不会返回给您,而是返回有效页面。

答案 1 :(得分:0)

由于相关网站显示网页存在,因此您无能为力。如果仅针对某些网站,我建议您在回复正文中搜索表明其与您的标准不符的内容(例如“无帖子”)。转到http://googlewebmastercentral.blogspot.com.au/500067890给出404,那么示例页面是否确实存在?

// lazy and untested example. Can't remember if getContentEncoding gives character encoding

String charset = urncon.getContentEncoding();
if (charset == null) {
    // Sane default
    charset = "UTF-8";
}
String data = org.apache.commons.io.IOUtils.toString(urncon.getInputStream(), charset);
if (!data.contains("foobar")) {
    throw new IOException("Site not liked");
}

编辑:添加了IOUtils的包名和固定方法名。

答案 2 :(得分:0)

没有万无一失的方法来实现你想要的东西,取决于网站如何处理404.他们可能只是压制它并为你提供自定义响应。

答案 3 :(得分:0)

如果它以200返回,则该页面存在,如果这是网站管理员选择的那样,那么就没有一种通用的方式来捕捉它。

答案 4 :(得分:0)

  

我的问题是某些网站没有提供404,并且会重定向或显示不应该显示的网页...

...带有200状态代码。

没有通用的解决方案。

如果网站选择以3xx或200响应不存在的页面,则没有通用的方法来区分响应页面和“真实”页面。实际上,响应页面可能与“真实”页面无法区分......即使对于人类也是如此。

您可以希望做的最好的事情是编写应用程序代码以识别您正在抓取的特定网站(或多个网站)的行为;例如通过在响应页面中查找特征字符串。

答案 5 :(得分:0)

大多数网站都会发送404“未找到网页”错误。如果他们正在改变响应,他们将不太可能设置为200,因为200是成功的。

但正如其他人所标记的那样,除非网站所有者通知其他人,否则您无法在代码中识别此信息。