【问题标题】:Fastest way to check list of crawler IPs via contains in Java通过 Java 中的 contains 检查爬虫 IP 列表的最快方法
【发布时间】:2010-12-05 14:47:24
【问题描述】:

我从以下网站获得了爬虫列表: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);  
}

请告知如何改进它以成为更快、更优雅的解决方案。我使用弹簧,所以豆子也是一种选择。

我想在列表中集成更新服务,但我没有找到有用的可下载 IP 列表,通过 Jsoup 解析网站从来都不是理想的解决方案。

【问题讨论】:

  • 如何将nofollow 属性添加到跟踪器的链接并查看UA 字符串?

标签: java performance web-crawler


【解决方案1】:

如果我理解正确,我想让你的 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/获取此代码

【讨论】:

    【解决方案2】:

    我认为你不应该在这里使用散列 - 334 个条目意味着对排序列表进行二分搜索需要 log2(334)=8,3837 步,散列函数可能需要更长的时间。

    使用ArrayList 并最初使用Collections.sort(List list) 对其进行排序。如果要查看某个IP,使用Collections.binarySearch(List list, Object key),查看返回值是否>=0(表示该IP在列表中)。

    【讨论】:

      【解决方案3】:

      你可以在hashset中查找之前使用bloom filter。这可以解决问题。布隆过滤器有一个错误+ve的问题。所以对于所有true布隆过滤器返回你将不得不查找再次在 hashset 中进行确认,但您可以确定全部为 false。此外,您可以将 hashset 替换为 radix tree/patricia trie,以获得更紧凑的存储空间。

      实现:

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2017-02-21
        • 2011-03-09
        • 2013-12-03
        • 2011-11-08
        • 1970-01-01
        • 1970-01-01
        • 2019-11-07
        • 2016-01-08
        相关资源
        最近更新 更多