21

嗨,我正在编写一个程序,它通过许多不同的 URL 并检查它们是否存在。我基本上是在检查返回的错误代码是否为 404。但是,当我检查超过 1000 个 URL 时,我希望能够非常快速地做到这一点。以下是我的代码,我想知道如何修改它以快速工作(如果可能的话):

final URL url = new URL("http://www.example.com");
HttpURLConnection huc = (HttpURLConnection) url.openConnection();
int responseCode = huc.getResponseCode();

if (responseCode != 404) {
System.out.println("GOOD");
} else {
System.out.println("BAD");
}

使用 JSoup 会更快吗?

我知道有些网站提供代码 200 并有自己的错误页面,但是我知道我正在检查的链接不这样做,所以这不是必需的。

4

3 回答 3

32

尝试发送“HEAD”请求而不是获取请求。这应该会更快,因为没有下载响应正文。

huc.setRequestMethod("HEAD");

再次检查响应状态是否不是 400,而不是检查它是否为 200。即检查是肯定的而不是否定的。404,403,402.. 所有 40x 状态几乎等同于无效的不存在的 url。

您可以使用多线程使其更快。

于 2013-08-08T20:00:19.403 回答
1

尝试询问下一个 DNS 服务器

class DNSLookup
{
    public static void main(String args[])
    {
        String host = "stackoverflow.com";
        try
        {
            InetAddress inetAddress = InetAddress.getByName(host);
            // show the Internet Address as name/address
            System.out.println(inetAddress.getHostName() + " " + inetAddress.getHostAddress());
        }
        catch (UnknownHostException exception)
        {
            System.err.println("ERROR: Cannot access '" + host + "'");
        }
        catch (NamingException exception)
        {
            System.err.println("ERROR: No DNS record for '" + host + "'");
            exception.printStackTrace();
        }
    }
}
于 2013-08-08T19:55:44.240 回答
0

似乎您可以设置 timeout 属性,确保它是可以接受的。如果您有许多要测试的 url,请并行执行,它会快得多。希望这会有所帮助。

于 2013-08-08T19:52:48.180 回答