web-dev-qa-db-fra.com

Java - Le moyen le plus rapide de vérifier si une URL existe

Bonjour, je suis en train d’écrire un programme qui passe par de nombreuses URL différentes et vérifie simplement si elles existent ou non. Je vérifie fondamentalement si le code d'erreur renvoyé est 404 ou non. Cependant, alors que je vérifie plus de 1 000 URL, je veux pouvoir le faire très rapidement. Ce qui suit est mon code, je me demandais comment je pouvais le modifier pour qu'il fonctionne rapidement (si possible):

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");
}

Serait-il plus rapide d'utiliser JSoup?

Je suis au courant que certains sites donnent le code 200 et ont leur propre page d'erreur, mais je connais les liens que je vérifie ne le fais pas, donc ce n'est pas nécessaire.

19
Matt9Atkins

Essayez d'envoyer une requête "HEAD" au lieu d'une requête get. Cela devrait être plus rapide puisque le corps de la réponse n'est pas téléchargé.

huc.setRequestMethod("HEAD");

Encore une fois, au lieu de vérifier si le statut de la réponse n’est pas 400, vérifiez s’il s’agit bien de 200. C’est-à-dire que le résultat est positif au lieu de négatif. 404, 403, 402 .. tous les statuts 40x sont presque équivalents aux URL non existantes non valides.

Vous pouvez utiliser le multi-threading pour le rendre encore plus rapide.

28
Vishnuprasad R

Essayez de demander au prochain serveur 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();
        }
    }
}
1
Khinsu

On dirait que vous pouvez définir la propriété timeout, assurez-vous qu'elle est acceptable. Et si vous avez plusieurs URL à tester, faites-les en parallèle, ce sera beaucoup plus rapide. J'espère que cela vous sera utile.

0
Spark8006