2010-12-05 28 views
2

j'ai obtenu la liste des robots d'exploration site Web suivant: http://www.karavadra.net/blog/2010/list-of-crawlers-bots-and-their-ip-addresses/#respondmoyen le plus rapide pour vérifier la liste des adresses IP via crawler contient en Java

Si vous connaissez une meilleure liste des adresses IP qui mettent à jour régulièrement s'il vous plaît laissez-moi savoir.

Maintenant, je crée l'objet:

private static final HashSet<String> list = new HashSet<String>(){{ 
     add("66.249.71.248"); 
     add("66.249.66.38"); 
     add("66.249.65.142"); // 331 more entires 
}}; 

Et je vérifie la liste par cette méthode:

public static boolean isCrawler(String ip){ 
    return list.contains(ip); 
} 

S'il vous plaît conseiller sur la façon d'améliorer ce pour être plus rapide et une solution plus élégante. J'utilise le printemps, donc les haricots sont aussi une option.

Je voudrais intégrer le service de mise à jour sur la liste mais je n'ai pas trouvé de liste IP téléchargeable qui serait utile et l'analyse de sites Web via Jsoup n'est jamais une solution idéale.

+0

Pourquoi faites-vous cela? – thejh

+0

Comment ajouter des attributs nofollow aux liens vers le tracker et regarder les chaînes UA? – thejh

Répondre

2

Si je vous ai bien compris, je voudrais accélérer la vérification de contains().

Bien que je crois que contient() de HashSet fonctionne bien de toute façon je pense que dans votre cas, vous pouvez l'améliorer un peu.

Vous stockez des adresses IP en tant que chaînes. L'adresse IP est en fait le numéro. Convertir IP en nombre et mettre le résultat dans l'ensemble. J'espère que cela fonctionnera plus vite.

Voici comment convertir IP au numéro:

public static Long ipToInt(String addr) { 
     String[] addrArray = addr.split("\\."); 

     long num = 0; 
     for (int i=0;i<addrArray.length;i++) { 
      int power = 3-i; 

      num += ((Integer.parseInt(addrArray[i])%256 * Math.pow(256,power))); 
     } 
     return num; 
    } 

Je pris ce code de http://teneo.wordpress.com/2008/12/23/java-ip-address-to-integer-and-back/

0

Je pense que vous ne devriez pas utiliser hash ici - 334 entrées signifie qu'une recherche binaire sur une liste triée prendrait log2 (334) = 8,3837 étapes, la fonction de hachage prendra probablement plus de temps.

Utilisez un ArrayList et commencez par le trier en utilisant Collections.sort(List list). Lorsque vous souhaitez vérifier une adresse IP, utilisez Collections.binarySearch(List list, Object key) et vérifiez si la valeur de retour est> = 0 (ce qui signifie que l'adresse IP figure dans la liste).

0

Vous pouvez utiliser un bloom filter avant de regarder dans les hashset.This peut fixer les choses up.The filtre bloom a un problème de faux + ve's.So pour tous true le filtre bloom retourne, vous aurez à chercher dans le HashSet encore une fois pour vous assurer, mais tout faux, vous pouvez être sûr.Egalement, vous pouvez remplacer votre hashset avec un radix tree/patricia trie pour un stockage plus compact.

: Implémentations