我从以下网站获得了爬虫列表:http://www.karavadra.net/blog/2010/list-of-crawlers-bots-and-their-ip-addresses/#respond
如果您知道更好的定期更新的 IP 列表,请告诉我。
现在我创建了对象:
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
}};
我正在通过这种方法检查列表:
public static boolean isCrawler(String ip){
return list.contains(ip);
}
请建议如何改进它,使其成为更快、更优雅的解决方案。我使用 spring,所以 beans 也是一种选择。
我想在列表中集成更新服务,但我没有找到有用的可下载 IP 列表,并且通过 Jsoup 解析网站从来都不是理想的解决方案。
请您参考如下方法:
如果我对你的理解是正确的,我想让你的 contains() 检查更快。
尽管我相信 HashSet 的 contains() 无论如何都能正常工作,但我认为在您的情况下您可以稍微改进一下。
您将 IP 地址存储为字符串。 IP地址实际上是数字。将 IP 转换为数字并将结果放入集合中。这有望更快地发挥作用。
这里是如何将 IP 转换为数字:
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;
}
我从 http://teneo.wordpress.com/2008/12/23/java-ip-address-to-integer-and-back/ 中获取了这段代码